Когда пользователи рисуют, пишут или взаимодействуют с приложением с помощью стилуса, они иногда касаются экрана ладонью. Событие касания может быть передано в ваше приложение до того, как система распознает и отклонит его как случайное касание ладонью.
Ваше приложение должно распознавать посторонние события касания и игнорировать их. В Android 13 и более поздних версиях API касания ладонью обрабатываются иначе, чем в других версиях API.
Результаты
Ваше приложение способно распознавать и отклонять касания ладонью при одновременном использовании нескольких указателей на Android 13 и более поздних версиях API, а также при одновременном использовании одного указателя на всех уровнях API.
Совместимость версий
Установите для вашего проекта minSDK уровень API 33 для событий с несколькими указателями. События с одним указателем поддерживаются на уровнях API.
Зависимости
Никто.
Распознавайте и игнорируйте прикосновения ладонями.
В 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.
}
}
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:
