需求分析
- TextView 尺寸隨文字內容變化 (
wrap_content)。
- 背景圖需精確貼合 View 實際大小,不拉伸變形,類似微信聊天氣泡。
核心解決方案
- 佈局屬性:
android:layout_width="wrap_content"、android:layout_height="wrap_content"。
- 限制最大寬度:防止長文字單行過長,可用
android:maxWidth 或父佈局約束。
- 關鍵:使用 .9.png (NinePatch) 圖片:
- 定義可拉伸區域 (左/上邊緣黑線) 與內容區域 (右/下邊緣黑線)。
- 邊框、圓角、尖角等裝飾保持固定尺寸,中間透明區域隨內容拉伸。
- Android Studio 右鍵圖片 →
Create 9-patch file 可視化編輯。
- 設定背景:
android:background="@drawable/bubble_bg" (引用 .9 圖)。
XML 範例
<TextView
android:id="@+id/tv_msg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:maxWidth="250dp"
android:padding="12dp"
android:background="@drawable/bubble_received_9"
android:textColor="#000"
android:textSize="16sp" />
常見坑點
- 直接用普通 PNG 設
background:圖片原始尺寸決定 View 大小,或被強制拉伸變形。
- .9 圖標記錯誤:可拉伸區域未包含透明內容區,導致內容區也被拉伸 (文字變形)。
- 未設
padding:文字貼邊,視覺擁擠;.9 圖內容區定義需大於 padding 區域。
進階:動態載入 .9 圖
Drawable d = ContextCompat.getDrawable(context, R.drawable.bubble_9);
textView.setBackground(d); // 確保 Drawable 是 NinePatchDrawable