Android中canvas.drawText 繪制文本居中
因?yàn)樽罱嚅_項(xiàng)目,時(shí)間主要花在 coding 和 review 上了,抽空寫個(gè)自定義控件中的小案例,但是雖然知識(shí)點(diǎn)很小但是在開發(fā)中很常用
首先來看這個(gè)方法:
drawText(String text, float x, float y, Paint paint)
首先第一個(gè)參數(shù) text 是我們需要繪制的文本,第二、三個(gè)參數(shù) x,y 是關(guān)鍵所在,其含義為:x默認(rèn)是這個(gè)字符串的左邊在屏幕的位置,y是指定這個(gè)字符baseline在屏幕上的位置。最后第四個(gè)參數(shù) paint 是我們的畫筆,用于定義字體、大小、顏色等屬性。
這圖用iPad隨手畫的,可以很清楚地看出x和y參數(shù)的意義。
在這里插入圖片描述
那么怎么做才能獲取正確的居中位置呢,這里需要一些運(yùn)算,直接上代碼:
@Override
protected void onDraw(Canvas canvas) {
String testString = "測試文字";
//設(shè)置要繪制的字體
Paint mPaint = new Paint();
mPaint.setTypeface(Typeface.create(Typeface.DEFAULT_BOLD, Typeface.BOLD));
mPaint.setTextSize(30);
mPaint.setColor(ThemeUtil.getThemeColor(context, R.attr.colorAccent));
//將文字用一個(gè)矩形包裹,進(jìn)而算出文字的長和寬
Rect bounds = new Rect();
mPaint.getTextBounds(testString, 0, testString.length(), bounds);
FontMetricsInt fontMetrics = mPaint.getFontMetricsInt();
//計(jì)算長寬
int x = getMeasuredWidth() / 2 - bounds.width() / 2;
int y = (getMeasuredHeight() - fontMetrics.bottom + fontMetrics.top) / 2 - fontMetrics.top;
canvas.drawText(testString, x, y, mPaint);
}
在剛開始寫的時(shí)候,可能很多人會(huì)和我一樣寫成
canvas.drawText(testString, getMeasuredWidth()/2 - bounds.width()/2, getMeasuredHeight()/2 + bounds.height()/2,mPaint);
這不是真正的居中,雖然 y 確實(shí)是位于中間,但是會(huì)導(dǎo)致文字下沉,其原因還是因?yàn)槲疑厦嬷v的 y 不是字符中心,而是baseline在屏幕上的位置。