自定义View时,通常会去重写onDraw(Canvas canvas)方法,利用自带的canvas去绘制文字;但是系统自带Api文档介绍很是含糊不清,每次去定义的时候总会感觉摸不着头脑.先做一总结:
canvas.drawText()简单总结
- 起始点与对齐方式
public CustomView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
private void init() {
paint = new Paint(); //注意提前初始化对象
paint.setAntiAlias(true);
paint.setColor(Color.RED);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
paint.setTextSize(40);
//(200,100)是文字左下角的所在坐标
paint.setTextAlign(Align.LEFT);
canvas.drawText("左侧对齐", 200, 100, paint);
//(200,100)是文字右下角的所在坐标
paint.setTextAlign(Align.RIGHT);
canvas.drawText("右侧对齐", 200, 100, paint);
//(200,100)是文字中间最下点的所在坐标
paint.setTextAlign(Align.CENTER);
canvas.drawText("中间对齐", 200, 100, paint);
}
- 文字自身所占空间尺寸的获取
一些情况下需要考虑文字自身尺寸,比如绘制表格时需要文字水平中线对齐坐标轴:
//Api1: 粗略获取宽度
String text = "文字";
float measureText = paint.measureText(text); //结果78
//Api2: 稍微精确获取
Rect bounds = new Rect();
paint.getTextBounds(text, 0, text.length(), bounds);
int right = bounds.right; //结果80
可见两个Api还是有相当偏差的,尤其是在文字数量较多时;当然还有更精确的方法,不过方法二足够使用了;上述表格绘制就比较简单了:
//计算文字高度
String text = "文字";
Rect bounds = new Rect();
paint.getTextBounds(text, 0, text.length(), bounds ); //80
int bottom = bounds.bottom;
//右侧对齐y轴
paint.setTextAlign(Align.RIGHT);
//偏移文字高度的一半
canvas.drawText(text, x_origin, y_origin + bottom / 2, paint);