三十行程式碼解決textview排版問題
阿新 • • 發佈:2020-12-09
最近在預設的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。