在 Android 中實現 ImageButton 不同狀態(按下、聚焦、正常)顯示不同圖片,最標準的方式是使用 StateListDrawable(Selector)XML 資源檔。
建立 res/drawable/btn_image_selector.xml:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="https://schemas.android.com/apk/res/android">
<!-- 按下狀態 -->
<item android:state_pressed="true"
android:drawable="@drawable/btn_pressed" />
<!-- 聚焦狀態(鍵盤/觸控筆導航時) -->
<item android:state_focused="true"
android:drawable="@drawable/btn_focused" />
<!-- 選中狀態(如 ToggleButton) -->
<item android:state_selected="true"
android:drawable="@drawable/btn_selected" />
<!-- 禁用狀態 -->
<item android:state_enabled="false"
android:drawable="@drawable/btn_disabled" />
<!-- 預設/正常狀態(必須放最後) -->
<item android:drawable="@drawable/btn_normal" />
</selector>
<ImageButton
android:id="@+id/myImageButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/btn_image_selector"
android:src="@drawable/btn_normal"
android:scaleType="centerInside" />
ImageButton btn = findViewById(R.id.myImageButton);
// 程式碼中設置 Selector
btn.setBackgroundResource(R.drawable.btn_image_selector);
// 或設置前景圖(API 23+)
// btn.setForeground(ContextCompat.getDrawable(this, R.drawable.btn_image_selector));
若需「點擊切換、再次點擊切回」的邏輯(如收藏/取消收藏),需配合代碼:
boolean isSelected = false;
imageButton.setOnClickListener(v -> {
isSelected = !isSelected;
imageButton.setSelected(isSelected); // 觸發 state_selected
// 更新資料庫/狀態
});
並在 selector 中添加 android:state_selected="true" 項。