安卓自定义View,然后drawText实现绘制字体
怎么实现垂直居中,大致效果如下:
通常会有一个text文本的区域,为了很明显我画了矩形,实现就是字体垂直居中,一开始我尝试获取字体高度算,但是一些api方法总是不合适,现在整理如下
主要是函数
private int getBaseLine(Paint paint,int centerY){
return centerY-(paint.getFontMetricsInt().bottom+paint.getFontMetricsInt().top)/2;
}
给定Paint和居中y的坐标,算出字体垂直居中的baseLine
baseline其实就是canvas.drawText(str,x,y,paint)中的y
paint.getFontMetricsInt()获取当前指定paint绘制字体的参数
如图
其实一个字体都是top ascent baseLine descent bottom这样几根线
top ascent在baseLine上面 值是负数 绝对值是距离
那么思考获取居中字体的baseline
centerY-字体高度/2+(字体顶部到baseLine距离)
字体高度=paint.getFontMetricsInt().bottom-paint.getFontMetricsInt().top
字体顶部到baseLine距离 -paint.getFontMetricsInt().top
centerY-(paint.getFontMetricsInt().bottom-paint.getFontMetricsInt().top)/2+( -paint.getFontMetricsInt().top)
=>centerY-(paint.getFontMetricsInt().bottom+paint.getFontMetricsInt().top)/2
咋一看还以为是centerY-字高/2,其实不是这样的,主要是考虑想办法拿到字体的baseLine
测试代码如下
public class DrawTextView extends View {
private Paint mPaint;
public DrawTextView(Context context) {
super(context);
init();
}
private void init(){
mPaint = new Paint();
mPaint.setColor(Color.RED);
mPaint.setStrokeWidth(2f);
}
private int getBaseLine(Paint paint,int centerY){
return centerY-(paint.getFontMetricsInt().bottom+paint.getFontMetricsInt().top)/2;
}
public void onDraw(Canvas canvas){
super.onDraw(canvas);
mPaint.setStyle(Paint.Style.STROKE);
canvas.drawRect(new Rect(100,100,500,500),mPaint);
mPaint.setTextSize(25);
canvas.drawText("12345",100,getBaseLine(mPaint,(100+500)/2),mPaint);
}
}
new DrawTextView(context)调用即可看效果
网友评论