現象
`ImageView` 載入 PNG 圖片,原本設計為透明背景,運行後四周出現灰/白/色塊邊框。
核心原因:圖片檔案非純淨透明
- 設計軟體匯出時未勾選透明背景。
- 圖層邊緣存在**半透明像素**、**羽化**、**投影**、**描邊**殘留。
- 縮放/壓縮過程引入偽色邊緣。
- 圖片模式為 Indexed Color(索引色)且透明色表錯誤。
Android `ImageView` 本身不會添加背景色,它忠實渲染像素值。你看到的「背景」其實是圖片像素的一部分。
驗證方法
- 用 **系統圖片查看器**(Windows 照片、Mac 預覽)打開 PNG,背景若顯示格狀透明網格 → 圖片透明正常;若顯示實色 → 圖片有背景。
- 拖入 **瀏覽器** 新分頁,同理觀察。
- 用 **PhotoShop / GIMP** 開啟,檢查圖層面板是否有背景圖層、邊緣像素透明度。
徹底解決:PS 重新導出純淨透明 PNG
- 開啟原圖(或源圖層文件 `.psd` / `.xcf`)。
- 確保**圖層面板無背景圖層**(背景圖層鎖定圖示 → 雙擊轉為普通圖層 → 刪除)。
- 檢查邊緣:`Ctrl+點擊圖層縮圖` 載入選區 → `選區 > 修改 > 羽化 0px` → `選區 > 修改 > 擴張/收縮 1px` 觀察邊緣像素。
- 菜單 `檔案 > 匯出 > 另存為 Web 格式 (Legacy)` 或 `匯出為` → 格式 **PNG-24** → **勾選透明度** → 存檔。
- 替換專案 `res/drawable-xxx/` 對應圖片,Clean Project 重建。
代碼層面防禦(治標)
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/your_png"
android:background="@android:color/transparent" /> <!-- 明確聲明背景透明 -->
若圖片本身有色塊,`background` 無法移除圖片內容的像素。
進階:矢量圖替代
圖標、簡單圖形優先使用 **VectorDrawable (`.xml`)** 或 **WebP Lossless**,原生縮放無鋸齒、體積更小、無邊緣像素問題。
結論:**99% 是圖片導出問題**,用 PS 重導純淨 PNG-24 即解。不要懷疑 `ImageView`,它只是忠實的像素渲染器。