我們在android中經常會遇到自定義一些組件,因為現有的android組件是往往不能滿足當下的需求的,今天就給大家介紹一下在自定義組建過程中用到的drawText不居中的問題的解決方案
首先大家看一下這種圖:
這就是一個文字完整的區域划分圖,標示着完整的android在drawText的時候的書寫規則,那這些區域分別都是代表什么意思呢?
1. 基准點是baseline
2. Ascent是baseline之上至字符最高處的距離
3. Descent是baseline之下至字符最低處的距離
4. Leading文檔說的很含糊,其實是上一行字符的descent到下一行的ascent之間的距離
5. Top指的是指的是最高字符到baseline的值,即ascent的最大值
6. 同上,bottom指的是最下字符到baseline的值,即descent的最大值
其中Baseline是我們在調用drawText的時候一個參數,又是在drawText的時候的一個基准線和參考線,下面是drawText的時候需要傳的參數,根據注釋我們不難理解其字段分別代表的意思:
text:要寫上去的文字
x:寫的起始點x的坐標
y:baseline的坐標
paint:畫筆
下面來看下這幅圖:
藍色的橫線指的是繪制Text的目標矩形的中點:targetRect.centerY() = (targetRect.bottom + targetRect.top)/2
textCenterVerticalBaselineY 就是繪制文本時候的y坐標,targetRect.centerY()是控件一半的高度。其實這個換算關系也不難理解,targetRect.centerY()-fm.descent的意思是將整個文字區域抬高到控件的1/2,然后我們再加上(fm.descent - fm.ascent) / 2的意思就是將文本下沉文本descent到ascent長度的一半,從而實現文本垂直居中的目的。,不難看出計算公式應該為:
textCenterVerticalBaselineY = targetRect.centerY() + (fm.descent - fm.ascent) / 2- fm.descent ;
希望能夠對大家有所幫助
參考原文:http://blog.csdn.net/wan778899/article/details/51460849

