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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容