最近在默认的textview控件在排版时发现有不少问题,如图下图左边的文本:

原因无非是全角半角混一起,汉字英文混一起导致。
看了一些文章自己来弄一个自动换行的,换行原则是只要长度超过控件宽度,插入换行符号\n。
要注意的是不要忘记处理padding属性,如下图:

代码非常简单,自定义textview,在重写的onDraw方法里遍历字符串,计算要插入\n的地方,因此次方法不适合大量文字的显示。
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
float size = 15*getResources().getDisplayMetrics().density;//15是xml或代码中设置的字体大小(sp)
paint.setTextSize(size);
StringBuilder sb = new StringBuilder();
StringBuilder newSB = new StringBuilder();
int beginIndex = 0;
float viewWidth = getMeasuredWidth() - getPaddingLeft() - getPaddingRight();
for (int i=0; i<=text.length(); i++) {
String lastS = sb.toString();//上一个子串
sb.append(text.substring(beginIndex, i));
float w = paint.measureText(sb.toString());//获取sb字符串的宽
if (w > viewWidth) {//大于则添加换行
newSB.append(lastS + "\n");
sb.setLength(0);
beginIndex = i-1;//下一次的开始位置前移1
if (i == text.length()) {//防止最后一个字符漏了
newSB.append(text.substring(beginIndex, i));
break;
}
continue;
}else {
if (i == text.length()) {
newSB.append(sb.toString());
break;
}
}
beginIndex = i;
}
setText(newSB.toString());
}
最后说明一点,字体大小可以自行定义方法来设置并刷新。
利用该方法还可以实现文本的折叠,如下图,具体可以看demo。

本文介绍了在默认TextView中遇到的排版问题,主要是全角和半角字符混合导致的显示异常。作者提供了一个自定义TextView的解决方案,通过在onDraw方法中遍历字符串并在超过控件宽度时插入换行符。注意处理了padding属性,并给出了代码示例,此方法适用于少量文本的自动换行。此外,这种方法还可用于实现文本折叠功能。
457

被折叠的 条评论
为什么被折叠?



