当前位置: 移动技术网 > 移动技术>移动开发>Android > TextVie获取显示字符串的宽度之Android开发

TextVie获取显示字符串的宽度之Android开发

2019年07月24日  | 移动技术网移动技术  | 我要评论

此文通过判断textview要显示的字符串的宽度是否超过我设定的宽度,若超过则执行换行,具体代码讲解如下:

项目中的其他地方也有这样的需求,故直接使用了那一块的代码。

public float gettextwidth(context context, string text, int textsize){
textpaint paint = new textpaint();
float scaleddensity = context.getresource().getdisplaymetrics().scaleddensity;
paint.settextsize(scaleddensity * textsize);
return paint.measuretext(text);
}

这里是使用了textpaint的measuretext方法。

不过在项目实践上发现了这个方法存在一些问题。当字符串存在字母数字时,就会有1-2像素的误差。也正是这个误差,导致代码上判断换行错误,使得界面上显示出错。

为了解决这个问题,搜到了这篇文章 戳我

这篇文章中使用了另外一个方法测量,没有new textpaint,而是使用了textview自己的textpaint,这个paint通过textview.getpaint()方法获得。

最后给出一个例子来看这两种方法的差别。

测试机是mi4,xxdpi

public class mainactivity extends activity {

private final static string tag = "mainactivity";

@override
protected void oncreate(bundle savedinstancestate) {
super.oncreate(savedinstancestate);
setcontentview(r.layout.activity_main);

// 测试字符串
// 测试例子均用15sp的字体大小
string text = "测试中文";

textview textview = (textview) findviewbyid(r.id.test);
textview.settext(text);

int spec = measurespec.makemeasurespec(0, measurespec.unspecified);
textview.measure(spec, spec);

// getmeasuredwidth
int measuredwidth = textview.getmeasuredwidth();

// new textpaint measuretext
textpaint newpaint = new textpaint();
float textsize = getresources().getdisplaymetrics().scaleddensity * 15;
newpaint.settextsize(textsize);
float newpaintwidth = newpaint.measuretext(text);

// textview getpaint measuretext
textpaint textpaint = textview.getpaint();
float textpaintwidth = textpaint.measuretext(text);

log.i(tag, "测试字符串:" + text);
log.i(tag, "getmeasuredwidth:" + measuredwidth);
log.i(tag, "newpaint measuretext:" + newpaintwidth);
log.i(tag, "textview getpaint measuretext:" + textpaintwidth);

}
}

当测试字符串为: “测试中文”时,结果如下

测试字符串:测试中文
getmeasuredwidth:180
measuretext:180.0
getpaint measuretext:180.0
当测试字符串为: “测试英文abcd”时,

测试字符串:测试英文abcd
getmeasuredwidth:279
newpaint measuretext:278.0
textview getpaint measuretext:279.0
可见使用textview的textpaint调用measuretext方法得到的宽度才是真正的宽度。

通过以上代码可以顺利解决textview显示字符串的宽度,希望对大家有所帮助。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网