首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android 觸摸事件完整指南:Selector 狀態列表實現按鈕按下/抬起視覺反饋

     編輯:程式設計綜合問答

核心方案:XML StateListDrawable (Selector)

無需 Java/Kotlin 代碼監聽 ACTION_DOWN/ACTION_UP,純 XML 聲明即可實現狀態變色。

步驟 1:創建 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>

步驟 2:佈局文件中引用

<Button
    android:id="@+id/btn_submit"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="提交"
    android:background="@drawable/btn_selector" />

進階:Shape + 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);

常見誤區避坑

  • 順序很重要:Selector 從上往下匹配,默認項 必須放最後
  • 不要混淆 state_selected 與 state_pressed:前者為切換狀態(如 Tab),後者為觸摸按下
  • ImageView 不支援 background 狀態切換:需用 android:src="@drawable/selector" 或改用 ImageButton
  • API 21+ Ripple 效果:優先使用 ?attr/selectableItemBackground 獲得 Material Design 水波紋

何時必須用代碼監聽 OnTouchListener?

僅當需要觸摸座標、手勢識別、拖拽、自定義視圖繪製 時才需重寫 onTouchEvent 或設置 OnTouchListener。簡單按鈕反饋,Selector 方案效能最優、代碼最少。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved