Processar entradas indiretas de ponteiro no Jetpack Compose Glimmer

Dispositivos XR relevantes
Estas orientações ajudam você a criar experiências para esses tipos de dispositivos XR.
Óculos de exibição

O modificador onIndirectPointerGesture permite que o componente receba e responda a eventos de ponteiro indireto de alto nível, como os que vêm do touchpad de um dispositivo. Use esse modificador para capturar e processar gestos que vêm de um touchpad ou de uma fonte semelhante.

Superfície da API

Há quatro callbacks que o app pode usar para controlar o processamento:

  • onClick: acionado em um toque ou clique bem-sucedido sem movimento horizontal significativo.
  • onSwipeForward: acionado quando um deslize horizontal excede o limite de distância e velocidade na direção para frente.
  • onSwipeBackward: acionado quando um deslize horizontal excede o limite de distância e velocidade na direção inversa.
  • Enabled: quando definido como false, o modificador é ignorado e nenhum callback é invocado.

Comportamento do sistema para deslizar e rolar

O sistema usa um limite de toque para diferenciar um clique de um deslize.

  • Se o ponteiro se mover significativamente durante um estado de pressionamento, onClick será cancelado.
  • Se o ponteiro voltar significativamente durante um movimento, o gesto de deslizar será invalidado.

Exemplo: configurar o processamento de deslizamentos e cliques em um componente

O código a seguir configura o processamento de deslizamentos e cliques em um Box focalizável:

@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")
    }
}

Pontos principais sobre o código

  • O onIndirectPointerGesture requer foco, então o focusTarget também é aplicado para tornar o Box focalizável. Você pode usar focusTarget ou outro modificador que permita o foco, como surface. Sem foco, o modificador não pode atuar em eventos de ponteiro indireto.
  • Este exemplo implementa os callbacks onSwipeForward e onClick. Assim, os gestos de deslizar e clicar detectados são interceptados e consumidos, sem alcançar os contêineres pai. No entanto, você também pode deixar um callback específico nulo para transmitir um gesto para um modificador onIndirectPointerGesture em um contêiner pai.