TextVie获取显示字符串的宽度之Android开发
程序员文章站
2023-11-14 08:08:52
此文通过判断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显示字符串的宽度,希望对大家有所帮助。
推荐阅读
-
TextVie获取显示字符串的宽度之Android开发
-
Andorid开发之Picasso通过URL获取用户头像的圆形显示
-
Android开发之获取单选与复选框的值操作示例
-
Android开发之通过NITZ获取时区出错的解决
-
Android开发之获取系统当前时间的方法
-
Android开发之从服务器获取的数据为中文乱码的解决办法
-
Android开发之自定义EditText实现保留两位小数(附EditText光标宽度、颜色、高度的设置)
-
Android开发笔记之如何正确获取WebView的网页Title
-
TextVie获取显示字符串的宽度之Android开发
-
Andorid开发之Picasso通过URL获取用户头像的圆形显示