Android中canvas.drawText 绘制文本居中
2019-02-23 本文已影响0人
heyrenly
Android中canvas.drawText 绘制文本居中
因为最近多开项目,时间主要花在 coding 和 review 上了,抽空写个自定义控件中的小案例,但是虽然知识点很小但是在开发中很常用
首先来看这个方法:
drawText(String text, float x, float y, Paint paint)
首先第一个参数 text 是我们需要绘制的文本,第二、三个参数 x,y 是关键所在,其含义为:x默认是这个字符串的左边在屏幕的位置,y是指定这个字符baseline在屏幕上的位置。最后第四个参数 paint 是我们的画笔,用于定义字体、大小、颜色等属性。
这图用iPad随手画的,可以很清楚地看出x和y参数的意义。
那么怎么做才能获取正确的居中位置呢,这里需要一些运算,直接上代码:
@Override
protected void onDraw(Canvas canvas) {
String testString = "测试文字";
//设置要绘制的字体
Paint mPaint = new Paint();
mPaint.setTypeface(Typeface.create(Typeface.DEFAULT_BOLD, Typeface.BOLD));
mPaint.setTextSize(30);
mPaint.setColor(ThemeUtil.getThemeColor(context, R.attr.colorAccent));
//将文字用一个矩形包裹,进而算出文字的长和宽
Rect bounds = new Rect();
mPaint.getTextBounds(testString, 0, testString.length(), bounds);
FontMetricsInt fontMetrics = mPaint.getFontMetricsInt();
//计算长宽
int x = getMeasuredWidth() / 2 - bounds.width() / 2;
int y = (getMeasuredHeight() - fontMetrics.bottom + fontMetrics.top) / 2 - fontMetrics.top;
canvas.drawText(testString, x, y, mPaint);
}
在刚开始写的时候,可能很多人会和我一样写成
canvas.drawText(testString, getMeasuredWidth()/2 - bounds.width()/2, getMeasuredHeight()/2 + bounds.height()/2,mPaint);
这不是真正的居中,虽然 y 确实是位于中间,但是会导致文字下沉,其原因还是因为我上面讲的 y 不是字符中心,而是baseline在屏幕上的位置。