翻譯與 chris banes的部落格
如果你想手動在android canvas上畫些什麼東西,你最好從繪製文字開始。
文字繪製之前,你需要知道測量文字的繪製位置,計算文字x/y軸的位置。
paint mtextpaint = new paint();我沒想到**的執行後竟然是下面的這個樣子:mtextpaint.settextalign(paint.align.center); // center the text
// later when you draw...
canvas.drawtext(mtext, // text to display
mbounds.centerx(), // center x of canvas bounds
mbounds.centery(), // center y of canvas bounds
mtextpaint
);
測量文字
接下來,我嘗試定位文字,計算了文字的高寬度,並且修改了繪製文字x軸y軸的位置:
int mtextwidth, mtextheight; // our calculated text bounds
paint mtextpaint = new paint();
// now lets calculate the size of the text
rect textbounds = new rect();
mtextpaint.gettextbounds(mtext, 0, mtext.length(), textbounds);
mtextwidth = textbounds.width();
mtextheight = textbounds.height();
// later when you draw...
canvas.drawtext(mtext, // text to display
mbounds.centerx() - (mtextwidth / 2f),
mbounds.centery() + (mtextheight / 2f),
mtextpaint
);
這一次我們做的已經相當接近了,但是你可以看到文字還是沒有居中。
為了確定我沒看到的原因,我用paint.gettextbounds()計算乙個矩形,並畫在了文字的後面。
正如你看到的,文字的高寬繪製在了計算範圍之外。
另一中測量文字的方法
在這個基礎點上,我看到paint另一種計算文字寬度的方法:paint.measuretext()
這個方法只能計算寬度而不能計算高度,因此我嘗試結合兩種方法:
int mtextwidth, mtextheight; // our calculated text bounds
paint mtextpaint = new paint();
// now lets calculate the size of the text
rect textbounds = new rect();
mtextpaint.gettextbounds(mtext, 0, mtext.length(), textbounds);
mtextwidth = mtextpaint.measuretext(mtext); // use measuretext to calculate width
mtextheight = textbounds.height(); // use height from gettextbounds()
// later when you draw...
canvas.drawtext(mtext, // text to display
mbounds.centerx() - (mtextwidth / 2f),
mbounds.centery() + (mtextheight / 2f),
mtextpaint
);
這幾下就做出了完美居中的文字。悠嘻!
Android文字測量與繪製Tips
1 在用canvas繪製文字時需要測量文字的繪製範圍,比如字型的高度 寬度,常用的方法是使用paint.gettextbound string text,int start,int end,rect rect 然後通過傳入的rect返回長寬,不過這個測量的寬度有些誤差,導致計算位置座標是偏移。pai...
Android 文字居中繪製
遊戲中需要用到繪製玩家暱稱,繪製在乙個固定大小的rect中,要求文字左右和上下都居中,左右居中繪製比較容易,設定paint.settextalign align.center 並且設定需要繪製的字元的x座標是rect.width 2即可,上下居中要稍微麻煩一些,先要使用fontmetrics物件計算...
Android文字繪製Staticlayout
public staticlayout charsequence source,textpaint paint,int width,alignment align,float spacingmult,float spacingadd,boolean includepad public staticl...