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

如圖,圖中有兩行文字,每一行都有 5 條線:
top, ascent, baseline, descent, bottom。(leading 并沒有畫出來,因為畫不出來,下面會給出解釋)
baseline: 上圖中黑色的線。前面已經(jīng)講過了,它的作用是作為文字顯示的基準(zhǔn)線。ascent/descent: 上圖中綠色和橙色的線,它們的作用是限制普通字符的頂部和底部范圍。
普通的字符,上不會高過ascent,下不會低過descent,例如上圖中大部分的字形都顯示在ascent和descent兩條線的范圍內(nèi)。具體到 Android 的繪制中,ascent的值是圖中綠線和baseline的相對位移,它的值為負(fù)(因為它在baseline的上方);descent的值是圖中橙線和baseline相對位移,值為正(因為它在baseline的下方)。top/bottom: 上圖中藍色和紅色的線,它們的作用是限制所有字形( glyph )的頂部和底部范圍。
除了普通字符,有些字形的顯示范圍是會超過ascent和descent的,而top和bottom則限制的是所有字形的顯示范圍,包括這些特殊字形。例如上圖的第二行文字里,就有兩個泰文的字形分別超過了ascent和descent的限制,但它們都在top和bottom兩條線的范圍內(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é)果。