在绘制文字的时候,不可避免的用到 FontMetrics 类和 Canvas#drawText() 方法,这里详细介绍下。
FontMetrics
先看下面这张图:
图中有五条线,自上而下分别是:
- 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 坐标的话,那么以下等式成立:
1 | FontMetrics::top = Y(top 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
示例截图:
GitHub: FontMetricsSample