Un pennino può essere uno strumento eccezionalmente produttivo e creativo. Tuttavia, 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 può essere segnalato alla tua app prima che il sistema lo riconosca e lo ignori come tocco accidentale del palmo.
Best practice
La tua app deve identificare gli eventi tocco estranei e ignorarli. In Jetpack
Compose, puoi accedere all'MotionEvent Android sottostante da un
PointerEvent. Controlla MotionEvent per ACTION_CANCEL, che
indica che un gesto deve essere interrotto e potrebbe essere necessario eseguirne il rollback. Su
Android 13 (livello API 33) e versioni successive, controlla il flag FLAG_CANCELED
negli eventi ACTION_CANCEL e ACTION_POINTER_UP, che fornisce un
forte segnale che il tocco è stato involontario, ad esempio un tocco con il palmo.
Ingredienti
Modifier.pointerInput(): il modificatore Compose utilizzato per elaborare l'input del puntatore.PointerEvent: rappresenta un evento puntatore in Compose, che contiene una o più modifiche.PointerEvent.motionEvent: proprietà di estensione che fornisce l'accesso all'MotionEventAndroid sottostante (accettabile valore nullo).MotionEvent: rappresenta gli eventi di tocco e movimento. Contiene le informazioni necessarie per determinare se un evento deve essere ignorato.ACTION_CANCEL:MotionEventcostante che indica che un gesto è stato annullato; il gesto deve essere interrotto e potrebbe essere necessario il rollback.ACTION_POINTER_UP: costanteMotionEventche indica che un puntatore diverso dal primo è stato sollevato (ovvero ha perso il contatto con lo schermo del dispositivo).FLAG_CANCELED: costanteMotionEventche indica che il puntatore che sale ha causato un evento tocco involontario. Aggiunto agli eventiACTION_POINTER_UPeACTION_CANCELsu Android 13 (livello API 33) e versioni successive.
Passaggi
Esamina gli oggetti MotionEvent inviati alla tua app. Utilizza le API MotionEvent
per determinare le caratteristiche dell'evento:
- Eventi a un solo puntatore: controlla
ACTION_CANCEL, che indica che il gesto deve interrompersi. Su Android 13 e versioni successive, controlla ancheFLAG_CANCELEDper confermare che il tocco è stato involontario. - Eventi multi-pointer: su Android 13 e versioni successive, controlla
ACTION_POINTER_UPeFLAG_CANCELEDper identificare i tocchi involontari.
Rispondi a questi eventi interrompendo il gesto e annullando le modifiche temporanee.
1. Acquisire oggetti di eventi di movimento
Utilizza Modifier.pointerInput per elaborare l'input del puntatore su un componibile. Nell'ambito dell'input del puntatore, utilizza awaitPointerEventScope e awaitPointerEvent per ricevere eventi e recuperare l'MotionEvent Android sottostante utilizzando la proprietà motionEvent:
import androidx.compose.ui.input.pointer.pointerInput Box( modifier = Modifier .fillMaxSize() .pointerInput(Unit) { awaitPointerEventScope { while (true) { val event = awaitPointerEvent() val motionEvent = event.motionEvent if (motionEvent != null) { // Process motion event. } } } } )
2. Determina l'azione e i flag dell'evento
Controlla MotionEvent per ACTION_CANCEL, che indica un evento
a un solo puntatore su tutti i livelli API. Su Android 13 e versioni successive, controlla ACTION_POINTER_UP
per FLAG_CANCELED:
import androidx.compose.ui.input.pointer.pointerInput Box( modifier = Modifier .fillMaxSize() .pointerInput(Unit) { awaitPointerEventScope { while (true) { val event = awaitPointerEvent() val motionEvent = event.motionEvent ?: continue when (motionEvent.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 && (motionEvent.flags and MotionEvent.FLAG_CANCELED) == MotionEvent.FLAG_CANCELED ) { // Process canceled multi-pointer motion event for Android 13 and higher. } } } } } } )
3. Annullare il gesto
Una volta 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, consulta l'articolo Implementare un'app di disegno di base nel codelab Migliora il supporto dello stilo in un'app Android.
Risultati
Ora la tua app può identificare e rifiutare i tocchi del palmo per gli eventi multitocco sui livelli API Android 13 e successivi e per gli eventi con un solo tocco su tutti i livelli API.
Risorse aggiuntive
Per ulteriori informazioni, consulta le seguenti risorse:
- Funzionalità e API di Android 13 - Rilevamento del palmo migliorato
- Guide per gli sviluppatori
- Funzionalità avanzate dello stilo
- Sezione Palm rejection della pagina Compatibilità dell'input su schermi di grandi dimensioni
- Codelab: Migliora il supporto dello stilo in un'app Android