Android的DrawText詳解

轉自 http://blog.csdn.net/linghu_java/article/details/46404081


如果你經常使用Canvas的draw***方法去繪製一些圖像圖形,繪製的座標是從Canvas左上角開始計算的,如果想要把一個圖像放到某個位置,直接drawBitmap傳遞圖片左上角的座標就行了。那drawText就不一樣,如果你傳遞進去字符串,會發現文字的位置和你指定的不一樣。

Android的文檔也沒有仔細說,打開源碼一看,又跑到native代碼裏去執行了。

1408964085_thumb.jpeg

對於一段文字來說,如果你想把他畫到Canvas上,首先你要確定這段文字的範圍,即寬度和高度,那麼怎麼去取這一段的高度呢,如果你在網上搜,會有很多種答案,具體應該用哪一種呢?這要看你到底需要什麼樣的尺寸了。

Paint.getTextBounds: 當你通過這個方法來獲取尺寸的時候,你可以得到能夠包裹文字的最小矩形,就是圖中紅色邊框的那部分,你可以得到一個Rect對象,包含這個最小尺寸的幾個值。坑其實就在這裏:這裏的Rect對象座標並不是以左上角爲準的,而是相對於左邊中間靠下位置的一個點,就是圖中的黃色五角星。而這裏水平的Baseline指的是字符串對齊的一條線。既然這樣,r.top就是一個負值了,r.bottom會是一個小一點的正值,r.left和r.right在圖中畫的都很清楚。通過r.width()和r.height()來獲取尺寸。

那麼文字的偏移就好說了,比如說你要把文字畫在Canvas的左上角,座標是(0,0),但是當你通過:

1 canvas.drawText(“dangwen”,0,0,paint);

來畫文字的時候,發現只有文字的下半部分畫出來了,因爲你傳遞進去的參數應該是以Baseline爲標準的,正確的方法是:

1 canvas.drawText(“dangwen”,-r.left,-r.top,paint);

Paint.getFontMetricsInt(): 當你通過這裏方法來獲取尺寸的時候,你獲取的只是一個垂直方向上的尺寸,這裏的ascent代表的是字體的上部,descent代表的是字體的下部,這裏需要注意的是這和上面獲得的Rect的top和bottom不太一樣,他們比比ascent和descent距離稍微小一些,這些具體的高度可能和不同的字體和渲染方式有關係,這裏就不深入了 #我是不懂#。

然後如果把文字寫入TextView(圖中藍色部分)並且設置TextView的高度和寬度設爲wrap_content,那麼TextView的高度就正好是FontMetricsInt.top – FontMetricsInt.bottom, 那寬度呢? Paint.measureText()。



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