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

今天看到在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()来获取字符串高度会更好一些。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值