ユーザーがタッチペンを使用して描画、書き込み、またはアプリの操作を行うと、手のひらが画面に触れることがあります。このタッチイベントが、手のひらでの偶発的なタッチとして認識されて無視される前に、アプリに報告される場合があります。
アプリは、不要なタッチイベントを識別して無視する必要があります。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. 操作を元に戻す
手のひらでのタップを識別した場合、操作による画面上の効果を元に戻すことができます。
手のひらでのタップなどの意図しない入力を元に戻すには、アプリでユーザー操作の履歴を保持する必要があります。履歴を保持する方法の例については、Codelab の 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 開発のより広範な目標を対象とした、厳選されたクイックガイド コレクションの一部です。