bug-textview半角,英文展示不全

在android的原生TextView中遇到如图所示等情况,由于特殊符号半角、或者字母串等等,TextView自动分割机制作出的效果并不美观。


image.png

image.png

尝试方案:
添加半角转全角后—一个数字或字母占两个字符,看似一行占满,但是间隙变大,视觉效果差。如下图

image.png
image.png

最终解决方案:
获取每一个字符测量长度,手动添加换行符。重新设置text。

public class AutoSplitTextView extends TextView {
    private String autoText;
    private float textWidth;
    private float textHeight;
    private Paint textPaint;

    public AutoSplitTextView(Context context) {
        this(context,null);
    }

    public AutoSplitTextView(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs,0);
    }

    public AutoSplitTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    //解决首次渲染,没有补全的bug。
    int mWidth = -1;
    @Override
    protected void onDraw(Canvas canvas) {
 //onDraw可能会被多次调用,因此不是每次调用都需要重绘,这里做了个判断,text是否跟上一次一样,若一样,不再计算,否则重新计算赋值
        if(mWidth != getWidth() || !autoText.equals(getText().toString()) ){
            autoText=autoSplitText(this);
            setText(autoText);
            mWidth = getWidth();
        }
        super.onDraw(canvas);

    }

    private String autoSplitText(AutoSplitTextView textView) {
        CharSequence rawCharSequence = textView.getText();
        String originText = rawCharSequence.toString();//获取原始文本
        textPaint = textView.getPaint();
        textWidth = textView.getWidth() - textView.getPaddingLeft() - textView.getPaddingRight();
        textHeight = textView.getHeight();
        String allTextLines=originText.replaceAll("\n","");
        StringBuilder stringBuilder = new StringBuilder();
        if (textPaint.measureText(allTextLines)>textWidth){
            //如果整行宽度超过控件所用宽度,则按字符测量,在超过可用宽度的最后一个字符添加换行符
            float lineWidth = 0;
            for (int i = 0; i < allTextLines.length(); i++) {
                char textChar = allTextLines.charAt(i);
                lineWidth += textPaint.measureText(String.valueOf(textChar));
                if (lineWidth <= textWidth) {
                    stringBuilder.append(textChar);
                } else {
                    stringBuilder.append("\n");
                    i--;
                    lineWidth = 0;
                }
            }
        }else {
            stringBuilder.append(allTextLines);
        }

        return stringBuilder.toString();
    }

    }

然后我们再来看一下


image.png
image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。