我正在测量文本Paint.getTextBounds(),因为我有兴趣获得要渲染的文本的高度和宽度.但是,实际呈现的文本总是比填充.width()的Rect信息宽一些getTextBounds().
令我惊讶的是,我进行了测试.measureText(),发现它返回了一个不同的(更高)值.我试一试,发现它是正确的.
为什么他们报告不同的宽度?我怎样才能正确获得高度和宽度?我的意思是,我可以使用.measureText(),但后来我不知道我是否应该相信.height()返回者getTextBounds().
根据要求,这里是重现问题的最小代码:
final String someText = "Hello. I believe I'm some text!";
Paint p = new Paint();
Rect bounds = new Rect();
for (float f = 10; f < 40; f += 1f) {
p.setTextSize(f);
p.getTextBounds(someText, 0, someText.length(), bounds);
Log.d("Test", String.format(
"Size %f, measureText %f, getTextBounds %d",
f,
p.measureText(someText),
bounds.width())
);
}
Run Code Online (Sandbox Code Playgroud)
输出显示的差异不仅得到大于1(且没有最后一分钟的舍入误差),也似乎增加与大小(我正要吸引更多的结论,但它可能是完全的字体相关的):
D/Test ( 607): Size 10.000000, measureText 135.000000, …Run Code Online (Sandbox Code Playgroud) Paint类中有一个方法:Paint.getTextBounds()返回Rect某些文本占用的内容.但根据这个答案,它会返回与TextView的宽度/高度不同的东西.
Q1:有没有办法Rect通过Paint.getTextBounds()返回TextView的宽度和高度?
注意,我确实需要精确地知道宽度/高度.我很高兴知道rect可能的错误大约2-3%的上限,但它必须不大(并且应该适用于任何不依赖于屏幕分辨率和像素密度的手机)然后TextView界限
Q2:有没有其他QUICK方法用指定的textSize确定某些文本的宽度和高度?
我知道,宽度可以由Paint.measureText()确定,但这不会返回高度.高度可以通过创建new StaticLayoutwith text然后调用StaticLayout.getHeight()来确定,但这太慢了.我需要更快的东西.
所有这一切的背景是AutoFitTextView通过向上或向下缩放文本大小自动将文本放入其边界内,并且它应该快速完成,因为很多这样AutoFitTextView的动态会很快动态变化.