最近在默认的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。