getFontMetrics() 獲取 Paint 的 FontMetrics。

FontMetrics 是個相對專業(yè)的工具類,它提供了幾個文字排印方面的數(shù)值:ascent, descent, top, bottom, leading。

image.png

如圖,圖中有兩行文字,每一行都有 5 條線:top, ascent, baseline, descent, bottom。(leading 并沒有畫出來,因為畫不出來,下面會給出解釋)

  • baseline: 上圖中黑色的線。前面已經(jīng)講過了,它的作用是作為文字顯示的基準(zhǔn)線。

  • ascent / descent: 上圖中綠色橙色的線,它們的作用是限制普通字符的頂部和底部范圍。
    普通的字符,上不會高過 ascent ,下不會低過 descent ,例如上圖中大部分的字形都顯示在 ascentdescent 兩條線的范圍內(nèi)。具體到 Android 的繪制中, ascent 的值是圖中綠線和 baseline 的相對位移,它的值為負(fù)(因為它在 baseline 的上方); descent 的值是圖中橙線和 baseline 相對位移,值為正(因為它在 baseline 的下方)。

  • top / bottom: 上圖中藍色紅色的線,它們的作用是限制所有字形( glyph )的頂部和底部范圍。
    除了普通字符,有些字形的顯示范圍是會超過 ascentdescent 的,而 topbottom 則限制的是所有字形的顯示范圍,包括這些特殊字形。例如上圖的第二行文字里,就有兩個泰文的字形分別超過了 ascentdescent 的限制,但它們都在 topbottom 兩條線的范圍內(nèi)。具體到 Android 的繪制中, top 的值是圖中藍線和 baseline 的相對位移,它的值為負(fù)(因為它在 baseline 的上方); bottom 的值是圖中紅線和 baseline 相對位移,值為正(因為它在 baseline 的下方)。

  • leading: 這個詞在上圖中沒有標(biāo)記出來,因為它并不是指的某條線和 baseline 的相對位移。 leading 指的是行的額外間距,即對于上下相鄰的兩行,上行的 bottom 線和下行的 top 線的距離,也就是上圖中第一行的紅線第二行的藍線的距離(對,就是那個小細(xì)縫)。
    FontMetrics 提供的就是 Paint 根據(jù)當(dāng)前字體和字號,得出的這些值的推薦值。它把這些值以變量的形式存儲,供開發(fā)者需要時使用。

  • FontMetrics.ascent:float 類型。

  • FontMetrics.descent:float 類型。

  • FontMetrics.top:float 類型。

  • FontMetrics.bottom:float 類型。

  • FontMetrics.leading:float 類型。

另外,ascent 和 descent 這兩個值還可以通過 Paint.ascent() 和 Paint.descent() 來快捷獲取。

FontMetrics 和 getFontSpacing():

從定義可以看出,上圖中兩行文字的 font spacing (即相鄰兩行的 baseline 的距離) 可以通過 bottom - top + leading (top 的值為負(fù),前面剛說過,記得吧?)來計算得出。

但你真的運行一下會發(fā)現(xiàn), bottom - top + leading 的結(jié)果是要大于 getFontSpacing() 的返回值的。

兩個方法計算得出的 font spacing 竟然不一樣?

這并不是 bug,而是因為 getFontSpacing() 的結(jié)果并不是通過 FontMetrics 的標(biāo)準(zhǔn)值計算出來的,而是另外計算出來的一個值,它能夠做到在兩行文字不顯得擁擠的前提下縮短行距,以此來得到更好的顯示效果。所以如果你要對文字手動換行繪制,多數(shù)時候應(yīng)該選取 getFontSpacing() 來得到行距,不但使用更簡單,顯示效果也會更好。

getFontMetrics() 的返回值是 FontMetrics 類型。它還有一個重載方法 getFontMetrics(FontMetrics fontMetrics) ,計算結(jié)果會直接填進傳入的 FontMetrics 對象,而不是重新創(chuàng)建一個對象。這種用法在需要頻繁獲取 FontMetrics 的時候性能會好些。

另外,這兩個方法還有一對同樣結(jié)構(gòu)的對應(yīng)的方法 getFontMetricsInt() 和 getFontMetricsInt(FontMetricsInt fontMetrics) ,用于獲取 FontMetricsInt 類型的結(jié)果。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容