煙臺產品網站建設百度seo如何做
常規(guī)限定文本長度 ( 通過 UntiyEngine.UI.Inputfiled 附帶的長度限定 )
痛點1
無法對中文,數字,英文進行識別,同樣數量的漢字和同樣數量的英文像素長度是不一樣的,當我們限定固定長度后,在界面上的排版不夠美觀
痛點2
當我們需要對用戶的名稱加限制長度的時候, 不同的文本( 漢字,字母,數字,符號 ) 外觀上長度不一,常規(guī)的裁切不夠優(yōu)雅,文本看上去也是突然的停頓了,比如中間的 “巴拉巴拉小魔仙”, “仙” 直接裁切了,處理方式太過僵硬
當然,我們可以用自動適配來縮小字體來解決以上問題,但整體看上去又不夠整齊,很容易出現大小層次不齊,整體看上去會很丑
如何解決呢?
第一個痛點,我們可以通過像素的方式,以單元格的方式去計算文本實際長度, 而非固定長度限制
如: 你好,世界! 占用的是10個單元格
而:hello,world 占用的是10個單元格
如上,雖然字符串長度不一樣,但是實際像素卻是一樣的 ( 這里我們做一個設定, 不足一個字母長度的當成一個字母長度, 如 !, ., _,-, 這些都是字母,但長度不一,我們按最大長度來處理,也就是一個英文字母 A的長度來設定 )
如何去判斷字符串中有多少個漢字,多少個特殊字符呢? 我們需要寫一個正則表達式來篩選,這里我封裝了一個類,來專門處理
這里,我額外處理,日文,韓文,這些長度都是等同于漢字的處理, 具體長度計算 我們只需要調用 GetTextSize 方法
大家也可以自行擴展,根據實際項目中的字體去更改大小比例,有的項目中 英文和漢字的比例是 1:1.5, 我本人的項目字體目前是1:2 所以
文本中漢字的實際大小 = 字符串包含漢字的數量x2
using System.Text.RegularExpressions;public class LanguageCounter
{// 統(tǒng)計字符串中的中文字符個數public static int CountChinese( string input ){return Regex.Matches( input, @"[\u4e00-\u9fff]" ).Count;}// 統(tǒng)計字符串中的英文字符個數public static int CountEnglish( string input ){return Regex.Matches( input, @"[a-zA-Z]" ).Count;}// 統(tǒng)計字符串中的符號個數(包括標點、特殊符號等)public static int CountSymbols( string input ){return Regex.Matches( input, @"[^\u4e00-\u9fff\w\s]" ).Count;}// 統(tǒng)計字符串中的數字個數public static int CountNumbers( string input ){return Regex.Matches( input, @"\d" ).Count;}// 統(tǒng)計字符串中的韓文字符個數public static int CountKorean( string input ){return Regex.Matches( input, @"[\uac00-\ud7af]" ).Count;}// 統(tǒng)計字符串中的日文字符個數public static int CountJapanese( string input ){return Regex.Matches( input, @"[\u3040-\u30ff]" ).Count;}// 空格數量public static int CountSpace( string input ){return Regex.Matches( input, @"\s" ).Count;}/// <summary>/// 獲取字符串中 單元大小/// /// 字符/字母/數字 按一個單元算/// 中文漢字,韓文,繁體,日文,片甲 按兩個單元算/// /// </summary>/// <param name="text"></param>/// <returns></returns>public static int GetTextSize( string text ){int chineseSize = LanguageCounter.CountChinese( text ) * 2;int japaneseSize = LanguageCounter.CountJapanese( text ) * 2;int koreaneseSize = LanguageCounter.CountKorean( text ) * 2;int englisheseSize = LanguageCounter.CountEnglish( text );int symbolsSize = LanguageCounter.CountSymbols( text );int numberSize = LanguageCounter.CountNumbers( text );int spaceSize = LanguageCounter.CountSpace( text );return spaceSize + chineseSize + englisheseSize + symbolsSize + numberSize + japaneseSize + koreaneseSize;}}
如何解決第二個痛點呢?
我們只需要限定長度,這個長度是實際單元像素長度,而非固定字符串長度去處理就行,尾號加上 … 就可以完美解決
public void SetName( string newName ){if ( LanguageCounter.GetTextSize( newName ) > 12 ){//這里,因為你永遠也不知道尾部的字符是 漢字,韓語, 特殊符號, 還是字母和數字,所以我們只需要遍歷去裁切計算長度就可以了//至于性能,這里不涉及UI,僅僅對數據進行遍歷,開銷可以忽略不記while ( LanguageCounter.GetTextSize( newName ) > 9 ){newName = newName.Remove( newName.Length - 1 );}newName = newName + "...";}//在最后我們將篩好的字符串賦值給 UI 就大功告成了nameText.text = newName;}