本文是对获取文字高度整理和总结,参考资料源自 statcoverflow的一个回答。具体参看下面的参考链接
获取文字高度的三个方法
- paint.getTextBounds(String text, int start, int end, Rect bounds)
- paint.getFontMetrics()
- StaticLayout
1 paint.getTextBounds(String text, int start, int end, Rect bounds)
参数解释
- text : 被测量的文字
- start: 被测量文字的起始位置
- end: 被测量文字的终止位置,最大为文字的长度
- rounds: 被测量文字
功能解释
如果我们想要获取一段string的精确高度,我们可以通过 paint.getTextBounds()方法来实现。 精确高度是指什么?举例来说,下面的 Happy new year 这几个文字中,三个单词的高度是不同的。 高度等于最上面一个像素减去最下面一个像素的高度。
所以,三者的高度是不同的。如何获取这三个高度呢?就是通过 paint.getTextBounds()方法。
String temp = "Happy"; //被获取的文字
Rect rect = new Rect();
Paint paint = new Paint();
paint.getTextBounds(temp, 0, temp.length(), rect);
int height = rect.height();
得到的height 就是我们目标文字的最终高度。
但是需要注意的是,上面的到的Happy, new, year 这三个单词的高度是不同的。
如果我们想将上面三个单词处理成同一个高度,该怎么办呢?
2 paint.getFontMetrics()
功能解释
paint.getFontMetrics() 帮助我们获取一段文字中字体的高度,注意这里说的是字体。使用这个方法,获取一段文字的高度都是相同的。
这里,fm中几个属性需要注意一下 我们先来看下面这张图。注意图中的 line1 line2 line3
其中 line 1 表示 Ascent;line2 表示baseline;line3 表示 Decent。 下面的截图中是我在一个demo中获取的一段文字的高度。
Ascent的值 和 Decent的值都是相对于baseLine而言的。从baseLine出发,向上为负,向下为正。
demo代码如下:
Paint paint = new Paint();
Paint.FontMetrics fm = paint.getFontMetrics();
float height1 = fm.descent - fm.ascent;
float height2 = fm.bottom - fm.top + fm.leading;
其中 height1 表示文字的高度, height2表示行高。注意这两者的区别。fm.leading 表示行间距。
之前的行高是针对单行的文字,如果我们的文字是多行的,要怎么获得多行文字的高度呢?
Happy new year
Happy new year
Happy new year
3 StaticLayout
StaticLayout 能帮助我们获得多行文字的高度。
参数解释:
new StaticLayout(CharSequence source, TextPaint paint,
int width,
Alignment align, float spacingmult, float spacingadd,
boolean includepad)
source: 被测量的文字
paint: TextPaint,paint 的子类,在绘制过程中会针对string附加一些信息。如下划线颜色,链接颜色。
width: 绘制区域的宽度
align: 文字在绘制区域中靠左?居中?还是靠右?
spacingmult: 行间距,倍数。eg: 在行间距1.6中,表示小数点前的1.
spacingadd:行间距,小于1,eg: 在行间距1.6中,表示小数点后的0.6.
includepad: 是否包括padding边距
demo 如下:
TextPaint paint = new TextPaint();
paint.setAntiAlias(true);
paint.setTextSize(10 * getResources().getDisplayMetrics().density);
paint.setColor(0xFFFF0000);
Layout.Alignment alignment = Layout.Alignment.ALIGN_NORMAL;
float spaceMultiplier = 1;
float spaceAddition = 0;
int textWidth = 100;
String temp = "Happy new year,Happy new year,Happy new year,Happy new year,Happy new year,Happy new year,Happy new year";
StaticLayout test = new StaticLayout(temp,paint,textWidth,alignment,spaceMultiplier,spaceAddition,false);