1. 程式人生 > 其它 >三十行程式碼解決textview排版問題

三十行程式碼解決textview排版問題

技術標籤:android開發javaandroid

最近在預設的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