最近有一個需求:玩家發的不同長度文字,需要自適應行數。
初步實現想法很簡單,直接獲取字符數均分行數,再利用string.substring()切割即可。但是顯而易見,由於一般字體下,中文顯示寬度一般是兩個數字|字母的寬度,所以直接分割的每一行元素個數一致,但是顯示長度卻長短不一。
解決辦法:利用遞歸實現此方法:
private void GetSubStringList(string str,int length,List<string> list) { string content = ""; string nextSub = ""; byte[] content = System.text.Encoding.Unicode.GetBytes(str); if (length>content.Length) { contentSub = str; if (contentSub != "") { list.Add(contentSub); } } else { int index = 0; for (int i = 0;i<length*2 &&i<str.Length*2;i++ ) { if ( i%2 != 0 && content[i] == 0) { index++; } } index += (int)Math.floor((double)(length - index)/2f); //漢字數*2+字符數=length if ( index >str.Length) { index = str.Length; } contentSub = str.Substring(0,index); nextSub = str.Substring(index); list.Add(contentSub); GetSubStringList(nextSub,length,list); } }
參數:str:需要切割的字符串;
length:每一行顯示的長度(字節數);
list:保存每一行的內容,使用時遍歷取出即可。
主要利用到 System.text.Encoding.Unicode.GetBytes()方法,將string字符串轉換成Unicode編碼的byte數組。Unicode編碼方式中:字符類型的第二字節為0;漢字第二字節大於0。