Как обрабатывать косвенный ввод с помощью указателя в Jetpack Compose Glimmer

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

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

API surface

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

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

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

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

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

Пример. Как настроить обработку пролистываний и кликов по компоненту

В следующем коде настраивается обработка пролистываний и кликов по элементу Box, на который можно установить фокус:

@Composable
fun OnIndirectPointerGestureSample() {
    var lastGesture by remember { mutableStateOf("None") }

    Box(
        modifier =
            Modifier.fillMaxSize()
                .onIndirectPointerGesture(
                    enabled = true,
                    onSwipeForward = { lastGesture = "Forward" },
                    onSwipeBackward = { lastGesture = "Backward" },
                    onClick = { lastGesture = "Click" },
                )
                .focusTarget(),
        contentAlignment = Alignment.Center,
    ) {
        Text("Last Gesture: $lastGesture")
    }
}

Важные сведения о коде

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