Android的drawText()參數詳解

查找了好幾個小時才終於搞明白,因爲參考的博客不在CSDN,所以複製一份,原文鏈接

Android的canvas上可以畫很多基本形狀,諸如:圓,矩形,線條等等,其中當屬文字即drawText()較難理解和使用(額,這只是就個人感受),下面將慢慢介紹下如何簡單使用drawText()。


FontMetrics

FontMetrics是Paint的一個內部類,主要定義了Paint繪圖時的一些關鍵座標位置,具體如下圖(1)所示:

圖(1): 
Base

其中:

ascent:該距離是從所繪字符的baseline之上至該字符所繪製的最高點。這個距離是系統推薦。
descent:該距離是從所繪字符的baseline之下至該字符所繪製的最低點。這個距離是系統推薦的。 
top:該距離是從所繪字符的baseline之上至可繪製區域的最高點。 
bottom:該距離是從所繪字符的baseline之下至可繪製區域的最低點。 
leading:爲文本的線之間添加額外的空間,這是官方文檔直譯,debug時發現一般都爲0.0,該值也是系統推薦的。 
特別注意: ascent和top都是負值,而descent和bottom:都是正值。


drawText()參數

理解好一個函數所需參數的具體含義,是用好一個函數的關鍵。canvas.drawText(String text, float x, float y, Paint paint)中有四個參數,這四個參數都是表示其相對於所在View中的座標,和屏幕座標無關。其中text和paint較容易理解,下面重點介紹x和y的具體含義。

float x:根據官方API上的解釋,該參數表示text被畫的起始x座標。其實text被畫的起始位置還與Paint有關,Paint的TextAlign屬性決定了text相對於起始座標x的相對位置。例如,TextAlign的默認屬性爲Paint.Align.LEFT,這是text就是從起始座標x的右側開始畫起。

圖(2): 
Left 
圖(3): 
Center

float y: 根據官方API上的解釋,該參數表示text被畫的起始y座標。這個解釋是比較抽象的,其實起始y座標所代表是text的baseline在Y軸方向的位置。


drawText()居中顯示

推導前提:Paint的TextAlign屬性值爲Paint.Align.LEFT,即爲默認屬性。

然後根據上面的參數介紹,drawText()的水平起始座標x很容易確定。

float x = getWidht() >> 1 - paint.measureText(String text) >> 1

比較棘手的是drawText()的垂直起始座標y,即baseline到底怎麼確定。其實我們可以由上圖(1)中各基準線間的相對位置關係推算出來。

假設我們所求的baseline的值爲baseY;

text的bottom距離: 
①bottomY = baseY + fontMetrics.bottom; 
text的字體高度: 
②fontHeight = fontMetrics.descent- fontMetrics.ascent 
因爲我們要讓text垂直居中,所以此時text的bottom距離應該爲: 
③bottomY=1/2 * height + 1/2 * fontHeight

所以由上述①②③公式就可以推得:④baseY = 1/2 * height + 1/2 * (fontMetrics.descent- fontMetrics.ascent) - fontmetrics.bottom 
此時求得baseline的值,即cavans.drawText()裏的y的座標。

推論:任意位置 
其實由上述公式④可知,在paint的size屬性不變情況下,只有height是變量,所以控制好height的值就可以把drawText()畫在View的任意的位置,公式就大家自己推導下把,我就不累述了。


後面自己看了下似乎有點下瑕疵: height/2 + (fontMetrics.descent- fontMetrics.ascent)/2,這個是到text的descent的距離,所以最後應該減去fontMetrics.descent,即最後:

height/2 + (fontMetrics.descent- fontMetrics.ascent)/2 - fontMetrics.descent

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章