Gestire gli input del puntatore indiretto in Jetpack Compose Glimmer

Dispositivi XR applicabili
Queste indicazioni ti aiutano a creare esperienze per questi tipi di dispositivi XR.
Occhiali con display

Il modificatore onIndirectPointerGesture consente al componente di ricevere e rispondere a eventi di puntatore indiretto di alto livello, come quelli provenienti dal touchpad di un dispositivo. Utilizza questo modificatore per acquisire ed elaborare i gesti provenienti da un touchpad o da una fonte simile.

Piattaforma API

Esistono quattro callback che la tua app può utilizzare per controllare la gestione:

  • onClick: attivato in caso di tocco o clic riuscito senza un movimento orizzontale significativo.
  • onSwipeForward: attivato quando uno scorrimento orizzontale supera la soglia di distanza e velocità in avanti.
  • onSwipeBackward: attivato quando uno scorrimento orizzontale supera la soglia di distanza e velocità nella direzione inversa.
  • Enabled: se impostato su false, il modificatore viene ignorato e non vengono richiamati callback.

Comportamento del sistema per lo scorrimento

Il sistema utilizza una soglia di tolleranza al tocco per distinguere tra un clic e uno scorrimento.

  • Se il puntatore si sposta in modo significativo durante uno stato di pressione, onClick viene annullato.
  • Se il puntatore torna indietro in modo significativo durante un movimento, il gesto di scorrimento viene invalidato.

Esempio: configura la gestione di scorrimenti e clic su un componente

Il seguente codice configura la gestione degli scorrimenti e dei clic su un Box attivabile:

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

Punti chiave sul codice

  • onIndirectPointerGesture richiede lo stato attivo, quindi viene applicato anche focusTarget per rendere attivabile Box. Puoi utilizzare focusTarget o un altro modificatore che attiva lo stato attivo, ad esempio surface. Senza lo stato attivo, il modificatore non può agire sugli eventi del puntatore indiretto.
  • Questo esempio implementa i callback onSwipeForward e onClick, quindi i gesti di scorrimento e clic rilevati vengono intercettati e consumati e non raggiungono i contenitori principali. Tuttavia, puoi anche lasciare un callback specifico null per passare un gesto a un modificatore onIndirectPointerGesture in un container principale.