Quando os usuários desenham, escrevem ou interagem com um app usando uma stylus, às vezes, eles tocam na tela com a palma da mão. O evento de toque pode ser informado ao app antes que o sistema reconheça e desconsidere o evento como um toque acidental da palma da mão.
O app precisa identificar e ignorar eventos de toque irrelevantes. O Android 13 e níveis de API mais altos indicam toques com a palma da mão de maneira diferente de todos os outros níveis de API.
Resultados
O app pode identificar e rejeitar toques da palma da mão em eventos de vários ponteiros no Android 13 e níveis da API mais recentes e em eventos de ponteiro único em todos os níveis da API.
Identificar e ignorar toques com a palma da mão
O Android cancela um toque da palma da mão enviando um objeto MotionEvent ao seu
app.
Examine objetos
MotionEventenviados para seu app. Use as APIsMotionEventpara determinar as propriedades do evento (ações e flags):- Eventos de ponteiro único: procure
ACTION_CANCEL. No Android 13 e mais recentes, procure também porFLAG_CANCELED. - Eventos com vários ponteiros: no Android 13 e mais recentes, procure
ACTION_POINTER_UPeFLAG_CANCELED.
- Eventos de ponteiro único: procure
Ignorar eventos de movimento com as propriedades
ACTION_CANCELeACTION_POINTER_UP/FLAG_CANCELED.
1. Obter objetos de eventos de movimento
Adicione um OnTouchListener ao 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. Determinar a ação e as flags do evento
Procure ACTION_CANCEL, que indica um evento de ponteiro único em todos os níveis de API. No Android 13 e mais recentes, procure ACTION_POINTER_UP em 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. Desfazer o gesto
Depois de identificar um toque da palma da mão, você pode desfazer os efeitos do gesto na tela.
O app precisa manter um histórico de ações do usuário para que entradas não intencionais, como toques da palma da mão, possam ser desfeitas. Para um exemplo de como manter o histórico, consulte Implementar um app de desenho básico no codelab Melhorar o suporte à stylus em um app Android.
Pontos principais
MotionEvent: representa eventos de toque e movimento. Contém as informações necessárias para determinar se um evento será desconsiderado ou não.OnTouchListener#onTouch(): recebe objetosMotionEvent.MotionEvent#getActionMasked(): retorna a ação associada a um evento de movimento.ACTION_CANCEL: constanteMotionEventque indica que um gesto precisa ser desfeito.ACTION_POINTER_UP: constanteMotionEventque indica que um ponteiro diferente do primeiro foi levantado, ou seja, parou de fazer contato com a tela do dispositivo.FLAG_CANCELED: constanteMotionEventque indica que o ponteiro que foi levantado causou um evento de toque não intencional. Adicionado aos eventosACTION_POINTER_UPeACTION_CANCELno Android 13 (nível 33 da API) e mais recentes.
Coleções que contêm este guia
Este guia faz parte das coleções de guias rápidos selecionados que abrangem objetivos mais amplos de desenvolvimento para Android: