使用者使用觸控筆繪圖、書寫或與應用程式互動時,他們的手掌有時可能會碰到螢幕。在系統將這類事件辨別為手掌誤觸,並加以忽略之前,可能就會先將觸控事件回報給您的應用程式。
您的應用程式必須辨識並忽略不必要的觸控事件。Android 13 以上的 API 級別會以不同於其他 API 級別的方式,指出手掌觸控操作。
結果
您的應用程式現在可以辨別並拒絕多指標事件 (在 Android 13 以上的 API 級別上) 和單指標事件 (在所有 API 級別上) 的手掌觸碰操作了。
辨識並忽略手掌觸控
Android 會將 MotionEvent 物件分派至應用程式,藉此取消手掌觸控事件。
檢查調度給應用程式的
MotionEvent物件。請使用MotionEventAPI 判斷事件屬性 (動作和旗標):- 單指標事件 - 檢查
ACTION_CANCEL。如果是 Android 13 以上版本,請一併檢查FLAG_CANCELED。 - 多指標事件 - 在 Android 13 以上版本中,檢查
ACTION_POINTER_UP和FLAG_CANCELED。
- 單指標事件 - 檢查
忽略具有
ACTION_CANCEL和ACTION_POINTER_UP/FLAG_CANCELED屬性的動作事件。
1. 取得動作事件物件
在應用程式中新增 OnTouchListener:
Kotlin
val myView = findViewById<View>(R.id.myView).apply { setOnTouchListener { view, event -> // Process motion event. } }
Java
View myView = findViewById(R.id.myView); myView.setOnTouchListener( (view, event) -> { // Process motion event. });
2. 判斷事件動作和標記
檢查是否有 ACTION_CANCEL,這表示所有 API 級別上的單指標事件。如果是 Android 13 以上版本,請檢查 ACTION_POINTER_UP 是否有 FLAG_CANCELED.。
Kotlin
val myView = findViewById<View>(R.id.myView).apply { setOnTouchListener { view, event -> when (event.actionMasked) { MotionEvent.ACTION_CANCEL -> { //Process canceled single-pointer motion event for all SDK versions. } MotionEvent.ACTION_POINTER_UP -> { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && (event.flags and MotionEvent.FLAG_CANCELED) == MotionEvent.FLAG_CANCELED) { //Process canceled multi-pointer motion event for Android 13 and higher. } } } true } }
Java
View myView = findViewById(R.id.myView); myView.setOnTouchListener( (view, event) -> { switch (event.getActionMasked()) { case MotionEvent.ACTION_CANCEL: // Process canceled single-pointer motion event for all SDK versions. case MotionEvent.ACTION_UP: if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && (event.getFlags() & MotionEvent.FLAG_CANCELED) == MotionEvent.FLAG_CANCELED) { //Process canceled multi-pointer motion event for Android 13 and higher. } } return true; });
3. 取消手勢
辨識出手掌觸碰事件後,您可以取消手勢在螢幕上引發的操作。
您的應用程式必須保留使用者動作記錄,以便在有手掌觸碰這類情形發生時,取消這些無意的輸入操作。如需如何維護記錄的範例,請參閱「強化 Android 應用程式中的觸控筆支援」程式碼研究室中的「實作基本繪圖應用程式」。
重點
MotionEvent:代表觸控和動作事件,包含判斷是否應忽略事件所需的資訊。OnTouchListener#onTouch():接收MotionEvent物件。MotionEvent#getActionMasked():傳回與動作事件相關聯的動作。ACTION_CANCEL:MotionEvent常數,表示應取消手勢。ACTION_POINTER_UP:MotionEvent常數,表示第一個指標以外的指標已上移 (也就是已放棄與裝置螢幕接觸)。FLAG_CANCELED:MotionEvent常數,表示指標上移是無意間的觸控事件所致。已在 Android 13 (API 級別 33) 以上版本加入ACTION_POINTER_UP和ACTION_CANCEL事件中。
包含本指南的集合
本指南是精選快速指南系列的一部分,涵蓋更廣泛的 Android 開發目標: