無需 Java/Kotlin 代碼監聽 ACTION_DOWN/ACTION_UP,純 XML 聲明即可實現狀態變色。
res/drawable/btn_selector.xml<selector xmlns:android="https://schemas.android.com/apk/res/android">
<!-- 按下狀態 -->
<item android:state_pressed="true" android:drawable="@color/colorPrimaryDark" />
<!-- 聚焦狀態(鍵盤/手柄導航) -->
<item android:state_focused="true" android:drawable="@color/colorAccent" />
<!-- 禁用狀態 -->
<item android:state_enabled="false" android:drawable="@color/gray" />
<!-- 默認狀態 -->
<item android:drawable="@color/colorPrimary" />
</selector>
<Button
android:id="@+id/btn_submit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="提交"
android:background="@drawable/btn_selector" />
<!-- res/drawable/btn_rounded.xml -->
<shape xmlns:android="https://schemas.android.com/apk/res/android" android:shape="rectangle">
<corners android:radius="8dp" />
<solid android:color="@color/colorPrimary" />
<stroke android:width="1dp" android:color="@color/colorPrimaryDark" />
</shape>
<!-- res/drawable/btn_rounded_selector.xml -->
<selector xmlns:android="https://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
<shape>
<corners android:radius="8dp" />
<solid android:color="@color/colorPrimaryDark" />
</shape>
</item>
<item android:drawable="@drawable/btn_rounded" />
</selector>
Button btn = findViewById(R.id.btn_submit);
btn.setBackgroundResource(R.drawable.btn_selector);
// 或構建 StateListDrawable
StateListDrawable states = new StateListDrawable();
states.addState(new int[]{android.R.attr.state_pressed}, getDrawable(R.color.pressed));
states.addState(new int[]{}, getDrawable(R.color.normal));
btn.setBackground(states);
state_selected 與 state_pressed:前者為切換狀態(如 Tab),後者為觸摸按下background 狀態切換:需用 android:src="@drawable/selector" 或改用 ImageButton?attr/selectableItemBackground 獲得 Material Design 水波紋僅當需要觸摸座標、手勢識別、拖拽、自定義視圖繪製 時才需重寫 onTouchEvent 或設置 OnTouchListener。簡單按鈕反饋,Selector 方案效能最優、代碼最少。