欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2022-06-29 09:18:15
此文通过判断textview要显示的字符串的宽度是否超过我设定的宽度,若超过则执行换行,具体代码讲解如下: 项目中的其他地方也有这样的需求,故直接使用了那一块的代码。...

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