通過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...