Android drawText
2021-05-15 本文已影响0人
Heezier
drawText
canvas.drawText(String text, float x, float y, Paint paint)
image-20210515093225084注释:
text : 文字的内容
x:文字在X轴的起始坐标
y:y为文字的基线(baseline)位置,并非文字在Y轴的起始坐标
baseline
baseline在文字中的表现,即E和h的下边界线
我们文字的绘制以baseline为基准,但是文字有可能绘制到baseline以下。
baseline的值就为以View的左上角为Y轴0点的距离
imgFontMetrics
它是一个Paint的内部类,作用是“字体测量”。它里面呢就定义了top,ascent,descent,bottom,leading五个成员变量
public static class FontMetrics {
public float ascent;
public float bottom;
public float descent;
public float leading;
public float top;
public FontMetrics() {
throw new RuntimeException("Stub!");
}
}
每个值含义如下:
top/bottom : 限制所有字形的顶部和底部范围,他的值是相对baseline为0点,往上是负值,往下是正值,所以bottom 是一个正数,top是一个负数
descent/ascent:是限制普通字符的顶部和底部范围,他的值是相对baseline为0点,往上是负值,往下是正值,所以descent是一个正数,ascent是一个负数
leading:指的是行的额外间距,即对于上下相邻的两 行,上行的 bottom 线和下行的 top 线的距离
因为语言字符很多,所有用top/bottom
image-20210515101524848FontMetrics的获取:
Paint.FontMetrics fontMetrics = paint.getFontMetrics();
如下:
image-20210515090833075文字的高度=descent - ascent
行高 = bottom - top
+ leading
绘制在View的Y轴中心
baseline的位置应该 = View的Y轴中心坐标值 + 文字高度的一半 - descent
由此可以得到:
baseline = getHeight()/2 + (fontMetrics.descent - fontMetrics.ascent) / 2 - fontMetrics.descent;
最终也可以简化为:
getHeight()/2 - (fontMetrics.descent + fontMetrics.ascent)/2;
image-20210515102714723
参考文章: