Android文字的測量和繪製

2021-07-16 07:02:08 字數 2328 閱讀 3073

翻譯與 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...