Android drawText

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点的距离

img

FontMetrics

它是一个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-20210515101524848

FontMetrics的获取:

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

参考文章:

https://www.jianshu.com/p/a8df026694c8

https://www.jb51.net/article/158939.htm

你可能感兴趣的:(Android drawText)