Когда пользователи рисуют, пишут или взаимодействуют с приложением с помощью стилуса, они иногда касаются экрана ладонью. Событие касания может быть отправлено в ваше приложение до того, как система распознает и отклонит это событие как случайное прикосновение ладони.
Распознавайте и игнорируйте прикосновения ладоней
Ваше приложение должно распознавать посторонние события касания и игнорировать их. Android отменяет прикосновение ладони, отправляя объект MotionEvent
в ваше приложение.
Изучите объекты
MotionEvent
отправленные в ваше приложение. Используйте APIMotionEvent
для определения свойств событий (действий и флагов):- События с одним указателем — проверьте
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:
![](https://developer.android.com/static/images/quick-guides/collection-illustration.png?hl=ru)