您的位置:首页 > 移动开发 > Android开发

Android引自coco2d获取字符串宽高/长度

2014-04-14 12:14 302 查看
今天看到在cocos2d中的CCTexture2D源码里面有对字符串的测量方法,感觉是比较靠谱。// 若还有更好的方式,请不要犹豫,分享下给我~~

避免浪费找资料人士的时间,直接上关联,下面还有几个其他的测量方法,有兴趣的往下滚滚:

Paint paint = new Paint();
float width = paint.measureText(txt);
float txtHeight = -paint.ascent() + paint.descent();


测试:

思路是采用 Paint 中的 measureText 跟 getTextBounds 方法,不过有几个点需要注意的,因为在网上也有看到说结果不是很准确。我的猜测是由于字体/字体大小的不同,所以会导致有不准确的结果。

----------------------------------- 贴点代码 ----------------------------------

Paint paint = new Paint();
Rect rect = new Rect();
// 测试不同类型的字符大小。假如这些字符都是相同的大小,那么我们在切割/自动换行字符串的时候就方便了....可惜貌似不能
String[] txts = { "a", "你", ",", " " };
for (String txt : txts) {
float txtWidth = paint.measureText(txt);
paint.getTextBounds(txt, 0, 1, rect);
Log.w(String.format("'%s' W (measureText)", txt), String.valueOf(txtWidth));
Log.w(String.format("'%s' W (getTextBounds)", txt), String.valueOf(rect.width()));
Log.w(String.format("'%s' H:", txt), String.valueOf(rect.height()));
}


结果如下:



从这一部分就可以看出, measureText 跟 getTextBounds 方法所得到的宽度就已经不一样了。 并且getTextBounds难道是能扫描出文本的真实宽高?结果导致' '扫出来是空白的(0,0)?? 你猜?

----------------------------------- 再贴点代码 ----------------------------------
Paint paint = new Paint();
float txtHeight = -paint.ascent() + paint.descent();// Paint.ascent is negative, so negate it
Log.w("H (without typeface)", String.valueOf(txtHeight));

// 测试不同字体所得到的行高是不是都一样.
String[] fonts = {"Arail","Times New Roman","宋体","Tahoma","黑体"};
for(String fontName :fonts){
Typeface typeface = Typeface.create(fontName, Typeface.NORMAL);
paint.setTypeface(typeface);
txtHeight = -paint.ascent() + paint.descent();
Log.w(String.format("H (typeface: %s)",fontName), String.valueOf(txtHeight));
}

结果如下:



CCTexture2D 中用-paint.ascent() + paint.descent() 来获取文本的高度,而 Times New Roman 你怎么会这么奇葩,得到的高度跟其他字体的不一样?

------------------------------- 总结 -----------------------------------
大概能想到的可能引起测量结果不一样的情况就这些了。
实际情况是我们需要的应该是字符串所呈现出来的大小,好进行字符串分割或者给加一个背景图片什么的。
所以我个人觉得使用measureText来获取字符串宽度,使用-paint.ascent() + paint.descent()来获取字符串高度会更好一些。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: