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

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

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

Результаты

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

Совместимость версий

Установите для вашего проекта minSDK уровень API 33 для событий с несколькими указателями. События с одним указателем поддерживаются на уровнях API.

Зависимости

Никто.

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

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

Java

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

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

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

Ваше приложение должно хранить историю действий пользователя, чтобы можно было отменить непреднамеренные действия, такие как касания ладонью. Пример того, как хранить историю, см. в разделе «Реализация базового приложения для рисования» в практическом руководстве по улучшению поддержки стилуса в приложении 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) и выше.

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

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

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

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

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