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

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

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

Результаты

Ваше приложение способно распознавать и отклонять касания ладонью для многоуказательных событий на уровнях API Android 13 и выше, а также для одноуказательных событий на всех уровнях 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.
    }
}

Ява

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

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

Проверьте наличие ACTION_CANCEL , которое указывает на событие с одним указателем на всех уровнях API. В Android 13 и выше проверьте наличие FLAG_CANCELED в 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) и выше.

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

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

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

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

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

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

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

Результаты

Ваше приложение способно распознавать и отклонять касания ладонью для многоуказательных событий на уровнях API Android 13 и выше, а также для одноуказательных событий на всех уровнях 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.
    }
}

Ява

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

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

Проверьте наличие ACTION_CANCEL , которое указывает на событие с одним указателем на всех уровнях API. В Android 13 и выше проверьте наличие FLAG_CANCELED в 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) и выше.

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

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

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

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

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