android text 測量尺寸相關(guān)

一逝淹、獲取推薦的行距

paint.getFontSpacing()

即獲取推薦的兩行文字的baseline之間的距離叉抡,這個值是系統(tǒng)根據(jù)文字的字體和字號自動計算的胞皱。
作用:手動繪制多行文字時,在需要換行的時候給y坐標加上這個值來下移文字

canvas.drawText(texts[0],x,y,paint);
canvas.drawText(texts[1],x,y+paint.getFontSpacing(),paint);

二、獲取FontMetrics系列信息

paint.getFontMetrics()

FontMetrics主要提供了以下幾個文字排印方面的數(shù)值:
ascent牵囤、descent、top滞伟、bottom揭鳞、leading
baseline:文字顯示的基線,文字開始繪制的位置
ascent / descent:限制普通字符的頂部和底部范圍梆奈,普通字符野崇,上不會高過ascent,下不會低過descent亩钟。ascent和descent的值是相對baseline的相對位移乓梨,所以ascent的值為負,descent的值為正清酥。
top / bottom:限制所有字形的頂部和底部范圍扶镀。除了普通字符,有些字形的顯示范圍是會超過ascent和descent的限制焰轻,但它們都在top和bottom兩條線的范圍內(nèi)臭觉。類似ascent/descent,top和bottom的值也是相對baseline的相對位移,top值為負蝠筑,bottom值為正狞膘。
leading:指的是行的額外間距,即相對于上下相鄰的兩行什乙,上行的bottom和下行的top的距離挽封。
(ascent和descent的值同時還可以通過paint.ascent()和paint.descent()方法來快捷獲取。)

三臣镣、FontMetrics和getFontSpacing()

從定義可以看出场仲,上圖中兩行文字的 font spacing (即相鄰兩行的 baseline 的距離) 可以通過 bottom - top + leading (top 的值為負,前面剛說過退疫,記得吧渠缕?)來計算得出。
但你真的運行一下會發(fā)現(xiàn)褒繁, bottom - top + leading 的結(jié)果是要大于 getFontSpacing() 的返回值的亦鳞。
兩個方法計算得出的 font spacing 竟然不一樣?
這并不是 bug棒坏,而是因為 getFontSpacing() 的結(jié)果并不是通過 FontMetrics 的標準值計算出來的燕差,而是另外計算出來的一個值,它能夠做到在兩行文字不顯得擁擠的前提下縮短行距坝冕,以此來得到更好的顯示效果徒探。所以如果你要對文字手動換行繪制,多數(shù)時候應該選取 getFontSpacing() 來得到行距喂窟,不但使用更簡單测暗,顯示效果也會更好。

四磨澡、獲取文字的顯示范圍

getTextBounds(String text, int start, int end, Rect bounds)

text:要測量的文字
start:文字的起始位置
end:文字的結(jié)束位置
bounds:存儲文字顯示范圍的對象

paint.setStyle(Paint.Style.FILL);
canvas.drawText(text, offsetX, offsetY, paint);
paint.getTextBounds(text, 0, text.length(), bounds);
bounds.left += offsetX;
bounds.top += offsetY;
bounds.right += offsetX;
bounds.bottom += offsetY;
paint.setStyle(Paint.Style.STROKE);
canvas.drawRect(bounds, paint);

五碗啄、測量文字的寬度并返回

paint.getMeasureText(String text);

前面有了 getTextBounds(),這里怎么又有一個 measureText()稳摄?
如果你用代碼分別使用 getTextBounds() 和 measureText() 來測量文字的寬度稚字,你會發(fā)現(xiàn) measureText() 測出來的寬度總是比 getTextBounds() 大一點點。這是因為這兩個方法其實測量的是兩個不一樣的東西厦酬。
getTextBounds: 它測量的是文字的顯示范圍(關(guān)鍵詞:顯示)胆描。形象點來說,你這段文字外放置一個可變的矩形仗阅,然后把矩形盡可能地縮小昌讲,一直小到這個矩形恰好緊緊包裹住文字,那么這個矩形的范圍霹菊,就是這段文字的 bounds剧蚣。
measureText(): 它測量的是文字繪制時所占用的寬度(關(guān)鍵詞:占用)支竹。前面已經(jīng)講過,一個文字在界面中鸠按,往往需要占用比他的實際顯示寬度更多一點的寬度礼搁,以此來讓文字和文字之間保留一些間距,不會顯得過于擁擠目尖。上面的這幅圖馒吴,我并沒有設(shè)置 setLetterSpacing() ,這里的 letter spacing 是默認值 0瑟曲,但你可以看到饮戳,圖中每兩個字母之間都是有空隙的。另外洞拨,下方那條用于表示文字寬度的橫線扯罐,在左邊超出了第一個字母 H 一段距離的,在右邊也超出了最后一個字母 r(雖然右邊這里用肉眼不太容易分辨)烦衣,而就是兩邊的這兩個「超出」歹河,導致了 measureText() 比 getTextBounds() 測量出的寬度要大一些。

六花吟、測量字符串每個字符的寬度

paint.getTextWidths(String text, float[] widths)

獲取字符串中每個字符的寬度秸歧,并把結(jié)果填入?yún)?shù) widths。
這相當于 measureText() 的一個快捷方法衅澈,它的計算等價于對字符串中的每個字符分別調(diào)用 measureText() 键菱,并把它們的計算結(jié)果分別填入 widths 的不同元素。
getTextWidths() 同樣也有好幾個變種今布,使用大同小異经备,不再介紹。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末险耀,一起剝皮案震驚了整個濱河市弄喘,隨后出現(xiàn)的幾起案子玖喘,更是在濱河造成了極大的恐慌甩牺,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件累奈,死亡現(xiàn)場離奇詭異贬派,居然都是意外死亡,警方通過查閱死者的電腦和手機澎媒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門搞乏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人戒努,你說我怎么就攤上這事请敦「涠悖” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵侍筛,是天一觀的道長萤皂。 經(jīng)常有香客問我,道長匣椰,這世上最難降的妖魔是什么裆熙? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮禽笑,結(jié)果婚禮上入录,老公的妹妹穿的比我還像新娘。我一直安慰自己佳镜,他們只是感情好僚稿,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蟀伸,像睡著了一般贫奠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上望蜡,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天唤崭,我揣著相機與錄音,去河邊找鬼脖律。 笑死谢肾,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的小泉。 我是一名探鬼主播芦疏,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼微姊!你這毒婦竟也來了酸茴?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤兢交,失蹤者是張志新(化名)和其女友劉穎薪捍,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體配喳,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡酪穿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了晴裹。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片被济。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖涧团,靈堂內(nèi)的尸體忽然破棺而出只磷,到底是詐尸還是另有隱情经磅,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布钮追,位于F島的核電站馋贤,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏畏陕。R本人自食惡果不足惜配乓,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望惠毁。 院中可真熱鬧犹芹,春花似錦、人聲如沸鞠绰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蜈膨。三九已至屿笼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間翁巍,已是汗流浹背驴一。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留灶壶,地道東北人肝断。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像驰凛,于是被迫代替她去往敵國和親胸懈。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容