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

在android的原生TextView中遇到如圖所示等情況,由于特殊符號半角、或者字母串等等,TextView自動分割機(jī)制作出的效果并不美觀。


image.png

image.png

嘗試方案:
添加半角轉(zhuǎn)全角后—一個數(shù)字或字母占兩個字符,看似一行占滿,但是間隙變大,視覺效果差。如下圖

image.png
image.png

最終解決方案:
獲取每一個字符測量長度,手動添加換行符。重新設(shè)置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);
    }

    //解決首次渲染,沒有補(bǔ)全的bug。
    int mWidth = -1;
    @Override
    protected void onDraw(Canvas canvas) {
 //onDraw可能會被多次調(diào)用,因此不是每次調(diào)用都需要重繪,這里做了個判斷,text是否跟上一次一樣,若一樣,不再計(jì)算,否則重新計(jì)算賦值
        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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容