unity中的Text元件如何獲得其中文字的尺寸

2021-09-26 14:48:20 字數 2940 閱讀 3177

獲得text中文字尺寸的方法有兩種:

(1)比較笨的方法是,預先計算出每個字元的尺寸,比如「oh我的baby」這句話,想要知道他的物理尺寸,需要知道每個英文本元的物理尺寸和每個中文字的物理尺寸。可以預先將26個英文本元都測量一下(包括大寫字元),中文字元基本上就等於text.fontsize的尺寸,將這些尺寸資料存到json檔案中,然後解析獲得配置字典。然後解析這句歌詞。將他轉化成字元遍歷,依次分割每個單詞和每個中文字元,分割之時計算每個單詞和每個中文字元的尺寸。每個單詞每個字元的尺寸計算出來之後就可以計算出整句話的長度了。

附上一段**:

核心的思路是:遍歷每個字元,執行如下操作:

(1)判斷當前字元若是中文字元if (sentence[i] >= 0x4e00 && sentence[i] <= 0x9fbb)就將他劃分成乙個字元並將他的尺寸記錄到perfontsizecach集合中,同時要看該字元之前是否有字元,若有字元判斷該字元是空格、是中文字元還是英文本元,若是空格或者中文字元就不管,若是英文本元就將前面累計的尺寸perfontlen的字元劃分為乙個單詞,同時將累計尺寸perfontlen放到perfontsizecache中。此外要把標記前乙個字元是中文字元的布林變數precharischinesetrue;

(2)若當前字元不是中文字元,那麼判斷當前字元是否被包含在配置字典中lyricsmanager.instance.chartosizemap,如果該字元不包含在配置字典中,就認為他是乙個單詞的一部分,他的尺寸都統一預設按48處理,累加到perfontlen上。若該字元被包含在該字典中,那麼就判斷precharischinese是否true,若為true即前乙個字元是中文字元那麼就認為當前字元是屬於當前字元的一部分,獲得他的尺寸並新增到累加尺寸上perfontlen += lyricsmanager.instance.chartosizemap[sentence[i].tostring()];如果前乙個字元是非中文本元,那麼判斷是否屬於一句話的第乙個字元、前乙個字元是否為空格及當前字元是否為空格,若滿足上述三種情況,那麼就認為之前的字串為乙個單詞,進行分割,將之前累加的字元尺寸perfontlen新增到每個字尺寸快取perfontsizecacheperfontsizecach.add(perfontlen);,此外此時要將當前的空格尺寸視為是下乙個字的一部分,將它的尺寸累加perfontlen = lyricsmanager.instance.chartosizemap[" "];,最後需要將前乙個字元是中文字元變數precharischinesefalse

(3)最後在每次遍歷最後都要判斷是否是最後乙個字元,及前乙個字元是否是中文字元,若是最後乙個字元,且前乙個字元不是中文字元,那麼就將前面累加字元新增到perfontsizecacheperfontsizecach.add(perfontlen);。因為在最後乙個字為英文單詞可能沒法劃分為乙個字,用這種方法來維持一致性。

totalsize = 0;

bool precharischinese = false;

float perfontlen = 0;

perfontsizecach.clear();

for (int i = 0; i < sentence.length; i++)

perfontlen += text.fontsize;

perfontsizecach.add(perfontlen);

precharischinese = true;

perfontlen = 0;

}else

else

}else

}else

precharischinese = false;

}if (i == sentence.length - 1 && precharischinese == false)

}

(2)另一種方法是比較先進的方法,直接利用text元件中的給定的api來求得。我們知道text中有font引用,在該引用中包含有該text引用的字型,其實乙個字串也就是放到乙個font中,通過font將他渲染到對應的紋理上以顯示出來的。而text只是提供了一種間接管理的作用。從接收字串,然後傳給font文字字串及一些其他的比如字型尺寸、字型風格等引數,然後font將把字型渲染出來。font中包含了很多屬性和方法以便於進行顯示處理。

在該處首先獲得text的font例項。我們想要獲得乙個文字的尺寸,那麼就需要先將文字渲染到紋理上font.requestcharactersintexture(),這樣font上才會包含該文字資料。在font中文字是按照乙個乙個字元繪製的,所以也應該按照乙個乙個字元去取到每個字元的資訊characterinfo。在每個字元資訊中包含有當前字元的尺寸characterinfo.advance,由此將每個字元的尺寸相加便可得出文字的尺寸。

font sentencefont = text.font;//獲得font的例項

sentencefont.requestcharactersintexture(sentence, 48, text.fontstyle);//先將文字繪製出來,

//由此處可以看出影響文字繪製的因素很多,有字型尺寸和字型風格等

characterinfo fontinfo;

char arr = sentence.tochararray();

for (int i = 0; i < arr.length; i++)

unity的UGUI筆記(二) Text

text是ui中顯示文字的元件,中文模式下很多都可以輕鬆理解其中的含義 以下是比較重要的東西 1.幾何對齊 以文字框為參考對齊,使用後更好的對齊貼合文字框,就像把word的 邊框去掉直接對齊一樣 個人理解 2.富文字 使用後可以支援字型調節,顏色,大小,粗細 3.水平 垂直溢位 使用overflow...

Android 常見的幾種元件獲取text方法。

常見的幾種元件獲取text方法。首先給各元件設定唯一的標識id,然後在oncreate方法中獲取元件物件,再通過對應方法獲取元件的text。注 為方便理解,這裡我所有的元件的id都設為name 1 獲取textview元件的text 根據id獲取textview物件 textview textvie...

如何理解Unity元件化開發模式

unity的開發模式核心 節點和元件,元件可以載入到任何節點上,每個元件都有 gameobject 屬性,可以通過這個屬性獲取到該節點,即遊戲物體。也就是說遊戲物體由節點和元件構成,每個元件表示物體的一種特性 能力 可以按照三條線路去理解unity的元件化開發模式 1 場景樹。場景樹由節點構成,使用...