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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值