Rejeitar toques da palma da mão na stylus

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 MotionEvent enviados para seu app. Use as APIs MotionEvent para 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 por FLAG_CANCELED.
    • Eventos com vários ponteiros: no Android 13 e mais recentes, procure ACTION_POINTER_UP e FLAG_CANCELED.
  • Ignorar eventos de movimento com as propriedades ACTION_CANCEL e ACTION_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 objetos MotionEvent.
  • MotionEvent#getActionMasked(): retorna a ação associada a um evento de movimento.
  • ACTION_CANCEL: constante MotionEvent que indica que um gesto precisa ser desfeito.
  • ACTION_POINTER_UP: constante MotionEvent que indica que um ponteiro diferente do primeiro foi levantado, ou seja, parou de fazer contato com a tela do dispositivo.
  • FLAG_CANCELED: constante MotionEvent que indica que o ponteiro que foi levantado causou um evento de toque não intencional. Adicionado aos eventos ACTION_POINTER_UP e ACTION_CANCEL no 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:

Permita que seu app ofereça uma experiência do usuário otimizada em tablets, dispositivos dobráveis e ChromeOS.

Tem dúvidas ou quer dar feedback?

Acesse nossa página de perguntas frequentes e confira guias rápidos ou entre em contato para compartilhar sua opinião.