Rect bounds = new Rect();
paint.getTextBounds(mText, 0, mText.length(), bounds);
FontMetricsInt fontMetrics = paint.getFontMetricsInt();
int baseline = (mRectHeight - fontMetrics.bottom + fontMetrics.top) / 2 - fontMetrics.top;
canvas.drawText(mText,(mRectWidth-bounds.width()) / 2, baseline, paint);
paint.getTextBounds(mText, 0, mText.length(), bounds);
这个方法会将mText String范围赋值我们传进去的Rect
getFontMetricsInt()方法我们先看个图
获取到的Metrics里面
public int top;
public int ascent;
public int descent;
public int bottom;
public int leading;
封装这些属性,根据上面的图片简单解释下
top =baseline上面的高度也就是 leading+leading
bottom=baseline下面的高度也就是 leading+leading
leading就是为一些上下标识有符号的字符预留的空间.
所以我们居中显示时就是整个控件的高度-bottom-top 由于baseline上面的top值是负值,所以我们加上它等同于减去它,然后 结果/2 -top (等于+top)
这样高度就居中了,宽度居中一样的我们用控件的宽度-stringwidth宽度然后/2 这样就宽度居中了