此文通过判断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显示字符串的宽度,希望对大家有所帮助。