微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

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

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

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

所有这一切的背景是制作AutoFitTextView,它将通过向上或向下缩放文本大小自动将文本放入其边界内,并且它应该快速完成,因为很多这样的AutoFitTextViews会非常快速地动态更改.

解决方法

找到一种简单而不慢的方法来确定使用不使用StaticLayout的特定Paint绘制的文本宽度/高度.
public int getTextWidth(String text,Paint paint) {
    Rect bounds = new Rect();
    paint.getTextBounds(text,text.length(),bounds);
    int width = bounds.left + bounds.width();
    return width;
}

public int getTextHeight(String text,bounds);
    int height = bounds.bottom + bounds.height();
    return height;
}

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

注意这个bounds.left – 这是问题的关键.

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

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

原文地址:https://www.jb51.cc/android/316660.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐