最近在自定义View中绘制文字的时候遇到需要测量文字的情况,查了一些资料,写下以备用。
API介绍
字体有6个参数:
- baseline
- ascent
- bottom
- descent
- leading
- top
baseline
基线的定义
The invisible line where all characters sit.
Definition: In typography, the baseline is the imaginary line upon which a line of text rests. In most typefaces, the descenders on characters such as g or p extend down below the baseline while curved letters such as c or o extend ever-so-slightly below the baseline. The baseline is the point from which other elements of type are measured including x-height and leading. The baseline is also significant in the alignment of drop caps and other page elements.
In typography and penmanship, the baseline is the line upon which most letters “sit” and below which descenders extend.
In the example to the right, the letter ‘p’ has a descender; the other letters sit on the (red) baseline.
Most, though not all, typefaces are similar in the following ways as regards the baseline:
- capital letters sit on the baseline. The most common exceptions are the J and Q.
- Lining figures (see Arabic numerals) sit on the baseline.
- The following text figures have descenders: 3 4 5 7 9.
- The following lowercase letters have descenders: g j p q y.
- Glyphs with rounded lower extents (0 3 5 6 8 c C G J o O Q U) dip very slightly below the baseline (“overshoot”) to create the optical illusion that they sit on the baseline. Peter Karow’s Digital Typefaces suggests that typical overshoot is about 1.5%.
The vertical distance of the base lines of consecutive lines in a paragraph is also known as line height or leading, although the latter can also refer to the baseline distance minus the font size.
基线是一条想象的线包裹着一个字符的上下两端,但不包裹字符的“下摆”。
ascent
baseline到字体顶部的距离。
bottom
一个或多个字符中的最低的字符到baseline的距离,也可以视作所有字符的descent值的最大值。
descent
字符自baseline以下到最低处的距离。
leading
行距,可以理解为当前行的所有字符的最低处到下一行字符的顶部的距离。
top
一个或多个字符中的最高处字符到baseline的距离,也可以视作所有字符的ascent的最大值。
获取文字高度
方法一:
// 此方法没有计算leading
Paint paint = new Paint();
// 设置字体大小
paint.setTextSize(xxx);
int height = paint.descent() - paint.ascent();
方法二:
Paint paint = new Paint();
// 设置字体大小
paint.setTextSize(xxx);
// 设置字体
paint.setTypeface(Typeface.xxx);
Paint.FontMetrics fontMetrics = paint.getFontMetrics();
float height1 = fontMetrics.descent - fontMetrics.ascent + fontMetrics.leading;
// height2测得的高度可能稍微比height1高一些
float height2 = fontMetrics.bottom - fontMetrics.top + fontMetrics.leading;
测量文字宽度
Paint paint = new Paint();
String str = "xxx";
// 设置字体大小
paint.setTextSize(xxx);
// 文字的宽度
float strWidth = paint.measureText(str);
通过文字所在的矩形区域获得宽和高(不如measureText方法得到的值精确)
Paint paint = new Paint();
String str = "xxx";
Rect rect = new Rect();
// 参数1:需要测量的字符串
// 参数2:需要测量的字符串的第一个字符的索引
// 参数3:需要测量的字符串的最后一个字符的索引+1,通常是需要测量的字符串的长度
// 参数4:Rect对象
paint.getTextBounds(str, 0, str.length(), rect);
// 文字的宽度
int width = rect.width();
// 文字的高度
int height = rect.height();