需求:多行文字,每行分左右兩欄,左欄標題寬度不固定,右欄描述需左對齊;換行時右欄文字必須保持與左欄對齊。類似「鍵值對」列表排版。
maxLeftWidth,onDraw 逐行繪製 Key 與 Value,Value 超寬則換行並縮進 maxLeftWidth。onDraw,導致重複計算,效能較差。onDraw 可能多次被呼叫,耗時計算應移至 setText 或 onSizeChanged。SpannableStringBuilder,用特殊分隔符(如 :)區分 Key/Value,onDraw 逐字元判斷繪製風格。setSpan 失效(未呼叫 super.onDraw),靈活度受限。LayoutParams.width。<LinearLayout android:orientation="horizontal">
<TextView android:id="@+id/left" android:layout_width="wrap_content" android:layout_marginRight="10dp"/>
<TextView android:id="@+id/right" android:layout_width="0dp" android:layout_weight="1"/>
</LinearLayout>
View,邏輯同方案一但更輕量。| 方案 | 繼承類別 | View 數量 | 效能 | 功能完整度 | 實作複雜度 | 推薦場景 |
|---|---|---|---|---|---|---|
| 一 | TextView | 1 | ★★★★★ | 中(無選取/複製) | 中 | 高效能純顯示、大量資料 |
| 二 | TextView | 1 | ★★☆☆☆ | 中 | 中 | 不推薦(onDraw 重複計算) |
| 三 | TextView | 1 | ★★★★☆ | 低(分隔符限制) | 高 | 簡單 Key/Value、固定格式 |
| 四 | GridLayout | 多 | ★★★☆☆ | 高 | 中 | 需標準佈局功能、資料量中等 |
| 五 | LinearLayout | 多 | ★★★☆☆ | 最高 | 低 | 通用業務、需無障礙/選取 |
| 六 | View | 1 | ★★★★★ | 最低 | 中 | 極致效能、純視覺呈現 |
所有方案的關鍵步驟都是:
Paint.measureText(key) 計算每個 Key 像素寬度maxLeftWidth,加上間距 paddingViewHolder 複用效能足夠。Android 文字對齊排版看似簡單,實則涉及測量、佈局、繪製多層機制。理解六大方案的權衡,依據專案「資料量、互動需求、維護成本」三維度決策,才能做出最適合的架構選擇。