簡體   English   中英

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

[英]How to quickly get width and height of TextView using Paint.getTextBounds()?

Paint類中有一個方法: Paint.getTextBounds()返回一些文本占用的Rect 但根據這個答案,它會返回與TextView的寬度/高度不同的東西。

Q1:有沒有辦法使用Paint.getTextBounds()返回的Rect獲取TextView的寬度和高度?

注意,我確實需要精確地知道寬度/高度。 我很樂意知道rect上限可能有大約2-3%的誤差,但它必須不大(並且應該適用於任何不依賴於屏幕分辨率和像素密度的手機)然后TextView界限

Q2:有沒有其他QUICK方法用指定的textSize確定某些文本的寬度和高度?

我知道,寬度可以由Paint.measureText()確定,但這不會返回高度。 可以通過使用文本創建新的StaticLayout然后調用StaticLayout.getHeight()來確定高度,但這太慢了。 我需要更快的東西。


所有這一切的背景是制作AutoFitTextView ,它將通過向上或向下縮放文本大小自動將文本放入其邊界內,並且它應該快速完成,因為很多這樣的AutoFitTextView很快動態變化。

找到一種簡單而不慢的方法來確定使用不使用StaticLayout特定Paint繪制的文本寬度/高度。

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)返回不從(0,0)開始的Rect 也就是說,要獲得文本的實際寬度將通過調用設置Canvas.drawText(String text, float x, float y, Paint paint)使用相同的 Paint從對象getTextBounds()你應該添加的左側位置Rect

注意這個bounds.left - 這是問題的關鍵。

通過這種方式,您將獲得使用Canvas.drawText()接收的相同寬度的文本。


這個答案中給出了更詳細的解釋。

使用java我使用了類FontMetrics。

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


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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM