Quando gli utenti disegnano, scrivono o interagiscono con un'app utilizzando uno stilo, a volte toccano lo schermo con il palmo delle mani. L'evento tocco potrebbe essere segnalato alla tua app prima che il sistema lo riconosca e lo ignori come tocco accidentale con il palmo.
Identificare e ignorare i tocchi con il palmo
L'app deve identificare gli eventi tocco estranei e ignorarli. Android annulla un tocco con il palmo inviando un oggetto MotionEvent
alla tua app.
Esamina gli oggetti
MotionEvent
inviati alla tua app. Utilizza le APIMotionEvent
per determinare le proprietà degli eventi (azioni e flag):- Eventi con un solo cursore: controlla se è presente
ACTION_CANCEL
. Su Android 13 e versioni successive, controlla anche la presenza diFLAG_CANCELED
. - Eventi con più cursori: su Android 13 e versioni successive, controlla la presenza di
ACTION_POINTER_UP
eFLAG_CANCELED
.
- Eventi con un solo cursore: controlla se è presente
Ignora gli eventi di movimento con le proprietà
ACTION_CANCEL
eACTION_POINTER_UP
/FLAG_CANCELED
.
1. Acquisisci oggetti evento di movimento
Aggiungi un OnTouchListener
alla tua app:
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. Determina l'azione e i flag dell'evento
Cerca ACTION_CANCEL
, che indica un evento con un solo cursore su tutti i livelli dell'API. Su Android 13 e versioni successive, controlla ACTION_POINTER_UP
per 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. Annullare il gesto
Dopo aver identificato un tocco con il palmo, puoi annullare gli effetti sullo schermo del gesto.
L'app deve conservare una cronologia delle azioni dell'utente in modo che gli input involontari, come il tocco con il palmo, possano essere annullati. Per un esempio di come gestire la cronologia, consulta Implementa un'app di disegno di base nel codelab Migliora il supporto dello stilo in un'app Android.
Punti chiave
MotionEvent
: rappresenta gli eventi di tocco e movimento. Contiene le informazioni necessarie per determinare se un evento deve essere ignorato.OnTouchListener#onTouch()
: riceve oggettiMotionEvent
.MotionEvent#getActionMasked()
: restituisce l'azione associata a un evento di movimento.ACTION_CANCEL
: costanteMotionEvent
che indica che un gesto deve essere annullato.ACTION_POINTER_UP
: costanteMotionEvent
che indica che un cursore diverso dal primo è salito (ovvero ha interrotto il contatto con lo schermo del dispositivo).FLAG_CANCELED
: costanteMotionEvent
che indica che il movimento del cursore verso l'alto ha causato un evento tocco involontario. Aggiunto agli eventiACTION_POINTER_UP
eACTION_CANCEL
su Android 13 (livello API 33) e versioni successive.
Risultati
Ora la tua app può identificare e rifiutare i tocchi con il palmo per gli eventi con più puntini su Android 13 e livelli API superiori e per gli eventi con un solo puntone su tutti i livelli API.
Raccolte che contengono questa guida
Questa guida fa parte di queste raccolte di guide rapide selezionate che coprono obiettivi di sviluppo Android più ampi:
![](https://developer.android.com/static/images/quick-guides/collection-illustration.png?hl=it)