如何使用Paint.getTextBounds()快速获取TextView的宽度和高度?

Pri*_*off 7 java performance android textview text-size

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的动态会很快动态变化.

Pri*_*off 10

找到一种简单而不慢的方法来确定Paint使用不具体的特定文本宽度/高度StaticLayout.

public int getTextWidth(String text, Paint paint) {
    Rect bounds = new Rect();
    paint.getTextBounds(text, 0, text.length(), bounds);
    int width = bounds.left + bounds.width();
    return width;
}

public int getTextHeight(String text, Paint paint) {
    Rect bounds = new Rect();
    paint.getTextBounds(text, 0, text.length(), bounds);
    int height = bounds.bottom + bounds.height();
    return height;
}
Run Code Online (Sandbox Code Playgroud)

技巧的简短描述:不从的开始Paint.getTextBounds(String text, int start, int end, Rect bounds)返回.也就是说,要获得将通过使用相同对象调用而设置的文本的实际宽度,应添加左侧位置.Rect(0,0)Canvas.drawText(String text, float x, float y, Paint paint) PaintgetTextBounds()Rect

注意这一点bounds.left- 这是问题的关键.

通过这种方式,您将获得与使用时相同的文本宽度Canvas.drawText().


这个答案中给出了更详细的解释.