Обработка косвенных указателей в Jetpack Compose Glimmer

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

Модификатор onIndirectPointerGesture позволяет компоненту получать и обрабатывать события непрямого указателя высокого уровня, например, исходящие от сенсорной панели устройства. Используйте этот модификатор для захвата и обработки жестов, поступающих от сенсорной панели или аналогичного источника.

Поверхность API

Для управления обработкой событий ваше приложение может использовать четыре функции обратного вызова:

  • onClick : Срабатывает при успешном касании или щелчке без значительного горизонтального перемещения.
  • onSwipeForward : Срабатывает, когда горизонтальное движение пальцем вперед превышает пороговое значение расстояния и скорости.
  • onSwipeBackward : Срабатывает, когда горизонтальное движение пальцем в обратном направлении превышает пороговое значение расстояния и скорости.
  • Enabled : Если установлено значение false , модификатор игнорируется, и никакие функции обратного вызова не вызываются.

Системное поведение при пролистывании и прокрутке

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

  • Если указатель мыши значительно смещается во время нажатия кнопки мыши, onClick отменяется.
  • Если указатель значительно смещается назад во время движения, жест смахивания аннулируется.

Пример: Настройка обработки жестов свайпа и кликов по компоненту.

Следующий код настраивает обработку жестов смахивания и кликов по фокусируемому Box :

@Composable
@Sampled
fun OnIndirectPointerGestureSample() {
    Box(
        modifier =
            Modifier.fillMaxSize()
                .onIndirectPointerGesture(
                    enabled = true,
                    onSwipeForward = { /* onSwipeForward */ },
                    onSwipeBackward = { /* onSwipeBackward */ },
                    onClick = { /* onClick */ },
                )
                .focusTarget()
    ) {
        // App()
    }
}

Основные моменты, касающиеся кода.

  • onIndirectPointerGesture требуется фокус, поэтому для того, чтобы сделать Box доступным для фокусировки, также применяется focusTarget . Вы можете использовать focusTarget или другой модификатор, позволяющий фокусироваться, например surface . Без фокуса модификатор не сможет реагировать на события косвенного указателя.
  • В этом примере реализованы коллбэки onSwipeForward и onClick , поэтому обнаруженные жесты смахивания и щелчка перехватываются и обрабатываются, не распространяясь на родительские контейнеры. Однако вы также можете оставить определенный коллбэк пустым, чтобы передать жест модификатору onIndirectPointerGesture в родительском контейнере.