7

Paint 类中有一个方法:Paint.getTextBounds(),它返回Rect被一些文本占用。但根据这个答案,它返回的内容与 TextView 的宽度/高度不同。

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

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

Q2:有没有其他QUICK方法来确定一些指定textSize的文本的宽度和高度?

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


所有这一切的背景是AutoFitTextView通过放大或缩小文本大小来自动将文本适应其边界,并且它应该快速做到这一点,因为会有许多这样AutoFitTextView的 s 非常快速地动态更改。

4

2 回答 2

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()应该添加Rect.

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

这样,您将收到与使用Canvas.drawText().


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

于 2013-03-13T23:45:15.393 回答
1

在 java 中,我使用了类 FontMetrics。

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


metric.stringWidth("the text I want to measure");
于 2013-03-13T13:33:01.797 回答