三十行代码解决textview排版问题

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

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

       

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值