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

时间:2013-03-13 12:58:00

标签: java android performance textview text-size

Paint类中有一个方法:Paint.getTextBounds()返回某些文本占用的Rect。但根据this回答,它会返回与TextView的宽度/高度不同的东西。

Q1:有没有办法使用Paint.getTextBounds()返回的Rect来获取TextView的宽度和高度?

注意,我确实需要精确地知道宽度/高度。我很高兴知道rect的上限可能有大约2-3%的错误,但它必须不大(并且应该适用于任何不依赖于屏幕分辨率和像素密度的手机)然后TextView界限< / p>

Q2:是否还有其他QUICK方法可以使用指定的textSize确定某些文字的宽度和高度?

我知道,宽度可以由Paint.measureText()确定,但这不会返回高度。可以通过创建带有文本的新StaticLayout然后调用StaticLayout.getHeight()来确定高度,但这太慢了。我需要更快的东西。


所有这些的背景是制作AutoFitTextView,它会通过向上或向下缩放文本大小自动将文本放入其边界内,并且应该快速完成,因为会有很多这样的AutoFitTextView {{1}} 1}}动态变化很快。

2 个答案:

答案 0 :(得分: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;
}

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

注意这个Rect - 这是问题的关键。

通过这种方式,您将获得使用bounds.left获得的相同宽度的文字。


this回答中给出了更详细的解释。

答案 1 :(得分:1)

使用java我使用了FontMetrics类。

Font f= new Font("Arial", Font.BOLD, 16);
FontMetrics metric = getFontMetrics(f);


metric.stringWidth("the text I want to measure");