一、FontMetrics
在使用Paint画text的时候,android使用和se中awt库的LineMetrics一样,来存储一行文字基于基准线的一些数据,这就是FontMetrics,存储为float,google还提供了一个Int版本,为了理解这个类,先上图:
这是我找到的一张史上最全的图片,包括文本字体信息的所有内容。
对应FontMetrics中的域分别为:
baseline:绘制一行文本的基准点,需要注意的是通过Paint.getTextBounds得到的Rect坐标是针对baseline上面的origin来定义的。
ascent:baseline到这行字符的最高处
descent:baseline到字符的最低处(强烈注意,字符最高处并不是整行的最高最低位置,和下面的top buttom区分)
leading:上一行字符到下一行字符之间的间距,详细描述就是上一行的descent到下一行ascent,拳拳到肉的感觉
top:这一行文本所占空间的顶部
buttom:这一行的底部
二、一个例子
在网上看到一个nice的例子,贴下来:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
@Override
public
void
onDraw (Canvas canvas) {
Paint paint =
new
Paint(Paint.ANTI_ALIAS_FLAG);
paint.setTextSize(
80
);
FontMetricsInt fmi = paint.getFontMetricsInt();
String testString =
"测试:ijkJQKA:1234"
;
Rect bounds1 =
new
Rect();
//这个函数返回的Rect的坐标是基于baseline的坐标,它是这个字符的刚刚好的边界
paint.getTextBounds(
"测"
,
0
,
1
, bounds1);
Rect bounds2 =
new
Rect();
paint.getTextBounds(
"测试:ijk"
,
0
,
6
, bounds2);
// 随意设一个位置作为baseline
int
x =
10
;
int
y =
50
;
// 把testString画在baseline上
canvas.drawText(testString, x, y, paint);
// bounds1
paint.setStyle(Style.STROKE);
// 画空心矩形
canvas.save();
canvas.translate(x, y);
// 跑到画这个文本的基准点,开始画前面测量的两段文字的外围框
// 测 的外围框
paint.setColor(Color.GREEN);
canvas.drawRect(bounds1, paint);
canvas.restore();
// bounds2
canvas.save();
//"测试:ijk" 的外围框
paint.setColor(Color.MAGENTA);
canvas.translate(x, y);
canvas.drawRect(bounds2, paint);
canvas.restore();
//回到原始的位置
paint.setStrokeWidth(
3
);
// baseline
paint.setColor(Color.RED);
canvas.drawLine(x, y,
1024
, y, paint);
// ascent
paint.setColor(Color.YELLOW);
canvas.drawLine(x, y+fmi.ascent,
1024
, y+fmi.ascent, paint);
// descent
paint.setColor(Color.BLUE);
canvas.drawLine(x, y+fmi.descent,
1024
, y+fmi.descent, paint);
// top
paint.setColor(Color.DKGRAY);
canvas.drawLine(x, y+fmi.top,
1024
, y+fmi.top, paint);
// bottom
paint.setColor(Color.GREEN);
canvas.drawLine(x, y+fmi.bottom,
1024
, y+fmi.bottom, paint);
}
|
效果如下:
最上面黑色 top 黄色 ascent 红线 baseline 蓝线 descent 最底下绿色 buttom
两个矩形分别是
测
测试:ijk 的外围框。