Quando gli utenti disegnano, scrivono o interagiscono con un'app utilizzando uno stilo, a volte toccano lo schermo con il palmo della mano. L'evento tocco potrebbe essere segnalato alla tua app prima che il sistema lo riconosca e lo ignori come tocco accidentale del palmo.
La tua app deve identificare gli eventi tocco estranei e ignorarli. Android 13 e i livelli API superiori indicano i tocchi del palmo in modo diverso rispetto a tutti gli altri livelli API.
Risultati
La tua app è in grado di identificare e rifiutare i tocchi del palmo per gli eventi multipuntatore su Android 13 e livelli API superiori e per gli eventi a puntatore singolo su tutti i livelli API.
Identificare e ignorare i tocchi del palmo
Android annulla il tocco del 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 a un solo puntatore: controlla la presenza di
ACTION_CANCEL
. Su Android 13 e versioni successive, controlla ancheFLAG_CANCELED
. - Eventi multi-pointer: su Android 13 e versioni successive, controlla
ACTION_POINTER_UP
eFLAG_CANCELED
.
- Eventi a un solo puntatore: controlla la presenza di
Ignora gli eventi di movimento con le proprietà
ACTION_CANCEL
eACTION_POINTER_UP
/FLAG_CANCELED
.
1. Acquisire oggetti di eventi di movimento
Per aggiungere 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
Controlla ACTION_CANCEL
, che indica un evento a un solo puntatore 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.
La tua app deve conservare una cronologia delle azioni dell'utente in modo che gli input involontari, come i tocchi con il palmo, possano essere annullati. Per un esempio di come mantenere la cronologia, consulta Implementare un'app di disegno di base nel codelab Migliorare 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 puntatore diverso dal primo è stato sollevato (ovvero ha perso il contatto con lo schermo del dispositivo).FLAG_CANCELED
: costanteMotionEvent
che indica che il puntatore che sale ha causato un evento tocco involontario. Aggiunto agli eventiACTION_POINTER_UP
eACTION_CANCEL
su Android 13 (livello API 33) e versioni successive.
Raccolte che contengono questa guida
Questa guida fa parte di queste raccolte selezionate di guide rapide che coprono obiettivi di sviluppo Android più ampi:
