Canvas的drawText方法詳解

2021-08-08 20:51:52 字數 2758 閱讀 1813

通過canvas的一些方法畫圓,畫矩形或者影象的時候,我們都需要有有乙個定位座標,即把圓或者矩形,畫在畫布上的上面位置,如:

思考:如果我們畫的是文字,那又改採用什麼樣的規則去畫呢?

1、四線格與基線

小時候,我們在剛開始學習寫字母時,用的本子是四線格的,我們必須把字母按照規則寫在四線格內。

比如:

那麼問題來了,在canvas在利用drawtext繪製文字時,也是有規則的,這個規則就是基線!

我們先來看一下什麼是基線:

可見基線就相當於四線格中的第三條線!

也就是說,只要基線的位置定了,那文字的位置必然是定了的!

對圖中的詞語解釋:

2、計算 基線baseline的y座標:

為了計算baseline的y座標,這裡通過一幅圖幫助我們理解:

在paint的內部有乙個內部類:fontmetrics,在它裡面封裝了一些屬性,如:top,bottom,ascent,descent等。

**top:**就是top線的y座標-baseline的y座標的值,因為android的座標系我們可以知道,baseline的y座標大於top線的y座標,所以fontmetrics的top屬性值永遠都是負值。

**bottom:**就是bottom線的y座標-baseline的y座標的值》0。

文字的高度=bottom-top;

假設baseline的y座標為baseliney

(1) 如果view是wrap_content的,那麼view的高度就是文字的高度:

baseliney=-fontmetrics.top,即取正值。

如果我們設定的值比fontmetrics.top這個值小,那麼文字就會顯示不完整了。

例項**如下:

paint paint = new paint();

paint.setcolor(color.red);

paint.settextsize(80);

paint.setstyle(paint.style.fill);

paint.fontmetrics fontmetrics = paint.getfontmetrics();

"世界和平", 0, math.abs(fontmetrics.top), paint);//文字完全顯示

canvas.drawtext("世界和平", 0, 20, paint);//文字會顯示不全

文字完全顯示的實現效果如下:

顯示不全的效果圖如下:

**(2)如果view的高度大於文字的高度:**假設文字垂直居中

空件的高度viewheight,

文字的高度為textheight=fontmetrics.bottom-fontmetrics.top;

baseliney=(viewheight-textheight)/2+textheight-fontmetrics.bottom,

簡化後baseliney=viewheight/2+textheight/2-fontmetrics.bottom。

即:baseliney=viewheight/2-fontmetrics.top/2-fontmetrics.bottom/2。

**如下:

paint paint = new paint();

paint.setcolor(color.blue);

rect rect = new rect(0, 0, getwidth(), 200);

canvas.drawrect(rect, paint);

paint.setcolor(color.red);

paint.settextsize(80);

paint.setstyle(paint.style.fill);

paint.fontmetrics fontmetrics = paint.getfontmetrics();

int baseline = (int) ((rect.bottom - rect.top) / 2

+ (fontmetrics.bottom - fontmetrics.top) / 2 - fontmetrics.bottom);

canvas.drawtext("世界和平", 0, baseline, paint);

實現效果圖:

可以看到,文字時居中的。

總結:我們利用paint.fontmetrics類提供的top和bottom屬性,就可以計算出baseline的y座標,至此,我們可以根據baseline的了解,實現乙個文字的居中顯示,居左顯示,居上顯示等特性的textview。

drawtext的位置問題

如圖所示,文字的內容安排,文字有一條基準線 baseline 為x軸,向下的方向上為y軸,所以在基準線 下方的為正值,在基準線上方的為負值在基準線距離文字矩形區域頂部距離為top值,距離文字矩形區域下面的底部距離為bottom值,在文字本身上,基準線距離文字本身的頂部為ascent 底部為desce...

改變 DrawText 字型

cfontfont verify font.createpointfont 180,arial pdc 建立字型 arial格式 180為字高 font def font pdc selectobject font 選擇該字型進入pdc m size pdc gettextextent tmp lp...

drawText用法總結

drawtext 經常使用canvas的draw 方法去繪製一些影象圖形,繪製的座標是從canvas左上角開始計算的,如果想要把乙個影象放到某個位置,直接drawbitmap傳遞左上角的座標就行了。那drawtext就不一樣,如果你傳遞進去字串,會發現文字的位置和你指定的不一樣 文字計算是基於bas...