Отклонять прикосновения стилуса ладонью

Когда пользователи рисуют, пишут или взаимодействуют с приложением с помощью стилуса, они иногда касаются экрана ладонью. Событие касания может быть отправлено в ваше приложение до того, как система распознает и отклонит это событие как случайное прикосновение ладони.

Распознавайте и игнорируйте прикосновения ладоней

Ваше приложение должно распознавать посторонние события касания и игнорировать их. Android отменяет прикосновение ладони, отправляя объект MotionEvent в ваше приложение.

  • Изучите объекты MotionEvent отправленные в ваше приложение. Используйте API MotionEvent для определения свойств событий (действий и флагов):

    • События с одним указателем — проверьте ACTION_CANCEL . На Android 13 и более поздних версиях также проверьте наличие FLAG_CANCELED .
    • События с несколькими указателями . В Android 13 и более поздних версиях проверьте ACTION_POINTER_UP и FLAG_CANCELED .
  • Игнорируйте события движения, имеющие свойства ACTION_CANCEL и ACTION_POINTER_UP / FLAG_CANCELED .

1. Получите объекты событий движения.

Добавьте OnTouchListener в свое приложение:

Котлин

val myView = findViewById<View>(R.id.myView).apply {
    setOnTouchListener { view, event ->
        // Process motion event.
    }
}

Ява

View myView = findViewById(R.id.myView);
myView.setOnTouchListener( (view, event) -> {
    // Process motion event.
});

2. Определите действие и флаги события.

Проверьте ACTION_CANCEL , который указывает на событие с одним указателем на всех уровнях API. В Android 13 и более поздних версиях проверьте ACTION_POINTER_UP на наличие FLAG_CANCELED.

Котлин

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
    }
}

Ява

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. Отменить жест

После того как вы определили прикосновение ладони, вы можете отменить экранные эффекты этого жеста.

Ваше приложение должно хранить историю действий пользователя, чтобы можно было отменить непреднамеренные действия, такие как прикосновения ладоней. Пример ведения истории см. в разделе «Реализация базового приложения для рисования» в разделе «Расширение поддержки стилуса в лаборатории кода приложения Android» .

Ключевые моменты

  • MotionEvent : представляет события касания и движения. Содержит информацию, необходимую для определения того, следует ли игнорировать событие.
  • OnTouchListener#onTouch() : получает объекты MotionEvent .
  • MotionEvent#getActionMasked() : возвращает действие, связанное с событием движения.
  • ACTION_CANCEL : константа MotionEvent , указывающая, что жест следует отменить.
  • ACTION_POINTER_UP : константа MotionEvent , указывающая, что указатель, отличный от первого, поднялся вверх (то есть прекратил контакт с экраном устройства).
  • FLAG_CANCELED : константа MotionEvent , указывающая, что подъем указателя вверх вызвал непреднамеренное событие касания. Добавлено в события ACTION_POINTER_UP и ACTION_CANCEL на Android 13 (уровень API 33) и более поздних версиях.

Результаты

Теперь ваше приложение может идентифицировать и отклонять прикосновения ладони для событий с несколькими указателями на уровнях API Android 13 и более поздних версий, а также для событий с одним указателем на всех уровнях API.

Коллекции, содержащие это руководство

Это руководство является частью тщательно подобранной коллекции быстрых руководств, охватывающих более широкие цели разработки Android:

Включите свое приложение для поддержки оптимизированного взаимодействия с пользователем на планшетах, складных устройствах и устройствах ChromeOS.

Есть вопросы или отзывы

Перейдите на нашу страницу часто задаваемых вопросов и узнайте о кратких руководствах или свяжитесь с нами и сообщите нам свои мысли.