在绘制文字的时候,不可避免的用到 FontMetrics 类和 Canvas#drawText() 方法,这里详细介绍下。
FontMetrics
先看下面这张图:

FontMetrics Lines
图中有五条线,自上而下分别是:
- top line: 文字可绘制区域最顶部的线;
- ascent line: 系统推荐的,文字可绘制区域顶部的线;
- baseline: 文字绘制的基线(在四线格上书写英文字母时的第三条线);
- descent line: 系统推荐的,文字可绘制区域底部的线;
- bottom line: 文字可绘制区域最底部的线。
而 FontMetrics 类中有 [top, ascent, descent, bottom, leading] 字段,与上面 5 条线的关系是: FontMetrics对象中的字段值 = 对应线条的 Y 坐标值 - baseline的 Y 坐标值 ,如果用 Y(line A) 表示线条 A 的 Y 坐标的话,那么以下等式成立:
FontMetrics::top = Y(top line) - Y(baseline);
FontMetrics::ascent = Y(ascent line) - Y(baseline);
FontMetrics::descent = Y(descent line) - Y(baseline);
FontMetrics::bottom = Y(bottom line) - Y(baseline);
需要注意的是: 通常情况下,Android 中的 y 轴的正方向是沿屏幕向下的,也就是越往下 y 坐标越大,所以 FontMetrics 的 top 和 ascent 值是负值, descent 和 bottom 的值是正值。
余下的字段 leading 表示 系统推荐的行间距。
在实际开发中,通常使用 Paint 的 getFontMetrics() 获得其对应的 FontMetrics 对象。
drawText()
绘制文字的时候,需要使用 Canvas 的 drawText(String text, float x, float y, Paint paint) 方法,其中的 text 表示 所需绘制的文字, paint 表示 画笔,这很好理解,那么 x 和 y 又是什么呢?
这里把 x 和 y 组成的点 (x, y) 称作 基点,用于控制文字绘制的基准位置,而 Paint 中的 Align 对象指定文字对齐方式。 基点 和 Align 共同作用从而成功绘制文字。特别地是:基点的 Y 坐标(也就是 y 值)其实就是前面提到的 baseline 的 Y 坐标。
比如:上面图中 baseline 上的黄点就是基点,可以观察得出其对齐方式 Align 就是 CENTER。
Sample
示例截图:

FontMetrics Sample
GitHub: FontMetricsSample
本文详细解析了Android中FontMetrics类与Canvas#drawText()方法的工作原理。介绍了FontMetrics类中的[top,ascent,descent,bottom,leading]字段含义及其与文字绘制区域线条的关系,解释了y轴方向及行间距概念。同时,深入探讨了drawText()方法中x和y参数的作用,即基点坐标,以及Paint.Align属性如何影响文字对齐。
2771

被折叠的 条评论
为什么被折叠?



