drawText垂直居中

安卓自定义View,然后drawText实现绘制字体
怎么实现垂直居中,大致效果如下:


drawText垂直居中_第1张图片
text居中.PNG

通常会有一个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绘制字体的参数

如图


drawText垂直居中_第2张图片
参数text.PNG

其实一个字体都是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)调用即可看效果

你可能感兴趣的:(drawText垂直居中)