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

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

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

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

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

  • 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 в родительском контейнере.