代码比较简单
此时文字的y
坐标虽然设置了getHeight()/2
,但很明显,文字所处的y
轴的位置不是控件的高的一半。很简单,文字本身也有高度,在绘制的时候,计算坐标并没有考虑文字本身的宽高。
public class DrawTextView extends View {
private Paint mPaint ;
private String text = "ABCDEFGGGG";
public DrawTextView(Context context, AttributeSet attrs) {
super(context, attrs);
initPaint();
}
/**
* 初始画笔
*/
private void initPaint() {
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mPaint.setColor(Color.parseColor("#FF9880"));
mPaint.setTextSize(90f);
}
/**
* 绘制
* @param canvas
*/
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawText(text, 0, getHeight()/2, mPaint);
}
/**
* 测量
* @param widthMeasureSpec
* @param heightMeasureSpec
*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int wSpecMode = MeasureSpec.getMode(widthMeasureSpec);
int wSpecSize = MeasureSpec.getSize(widthMeasureSpec);
int hSpecMode = MeasureSpec.getMode(heightMeasureSpec);
int hSpecSize = MeasureSpec.getSize(heightMeasureSpec);
if (wSpecMode == MeasureSpec.AT_MOST
&& hSpecMode == MeasureSpec.AT_MOST)
{
setMeasuredDimension(300,300);
}else if (wSpecMode == MeasureSpec.AT_MOST)
{
setMeasuredDimension(300,hSpecSize);
}else if (hSpecMode == MeasureSpec.AT_MOST)
{
setMeasuredDimension(wSpecSize,300);
}
}
}
在X轴居中
利用measureText(String text)
这个方法,很容易拿到要绘制文字的宽度,再根据(getWidth()-stringWidth)/2
简单计算,就可以得到在X
轴起始绘制坐标
在Y轴居中
想要在Y
轴居中,就要确定出绘制文字baseline
时的所在Y
轴的坐标。Android
中和文字高度相关的信息都存在FontMetrics
对象中。
在
FontMetrics
有五个float
类型值:
leading
留给文字音标符号的距离
ascent
从baseline
线到最高的字母顶点到距离,负值
top
从baseline
线到字母最高点的距离加上ascent
descent
从baseline
线到字母最低点到距离
bottom
和top
类似,系统为一些极少数符号留下的空间。top
和bottom
总会比ascent
和descent
大一点的就是这些少到忽略的特殊符号