美文网首页
Android drawText获取text宽度的三种方式

Android drawText获取text宽度的三种方式

作者: 梦幻世界wjl | 来源:发表于2017-08-14 14:51 被阅读0次
String str = "Hello";  
canvas.drawText( str , x , y , paint);  
  
//1. 粗略计算文字宽度  
Log.d(TAG, "measureText=" + paint.measureText(str));  
  
//2. 计算文字所在矩形,可以得到宽高  
Rect rect = new Rect();  
paint.getTextBounds(str, 0, str.length(), rect);  
int w = rect.width();  
int h = rect.height();  
Log.d(TAG, "w=" +w+"  h="+h);  
  
//3. 精确计算文字宽度  
int textWidth = getTextWidth(paint, str);  
Log.d(TAG, "textWidth=" + textWidth);  
  
    public static int getTextWidth(Paint paint, String str) {  
        int iRet = 0;  
        if (str != null && str.length() > 0) {  
            int len = str.length();  
            float[] widths = new float[len];  
            paint.getTextWidths(str, widths);  
            for (int j = 0; j < len; j++) {  
                iRet += (int) Math.ceil(widths[j]);  
            }  
        }  
        return iRet;  
    }

Paint类measureText与getTextBounds的区别

在使用Canvas绘制文字时,需要得到字符串的长度,Paint类内给了两个方法,measureText(),getTextBound();
可是对于同于字符串两个方法得出来的值有些差别:



getTextBounds() 得到的宽度总是比 measureText() 得到的宽度要小一点。
就查看方法的源码
getTextBounds():



measureText():

额,只能看出两种方法测量的方式不一样,getTextBounds()使用了nativeGetCharArrayBounds();measureText()使用了native_measureText().
然而并不能解决疑问,就上网搜。运气不错,有位大神详细的回答了。
下面贴出重点:

enter image description here
This is font size 60, in red is bounds rectangle, in purple is result of measureText.
It's seen that bounds left part starts some pixels from left, and value of measureText is incremented by this value on both left and right.
最后总结下:measureText()是计算出来的宽度是包含了内边距的,但是getTextBounds()这个方法计算的结果是不包含内边距的,只是计算这个文字包裹的矩形的宽高包含在矩形里面
原文链接:http://blog.csdn.net/lyndsc/article/details/51556508
上篇原文链接:http://blog.csdn.net/qin9r3y/article/details/8607014

相关文章

网友评论

      本文标题:Android drawText获取text宽度的三种方式

      本文链接:https://www.haomeiwen.com/subject/avsurxtx.html