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 audio e
display

Il modificatore onIndirectPointerGesture consente al componente di ricevere e rispondere a eventi di puntatore indiretti di alto livello, ad esempio 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 su un tocco o un 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à all'indietro.
  • Enabled: se impostato su false, il modificatore viene ignorato e non vengono richiamati callback.

Comportamento del sistema per lo scorrimento e lo scorrimento

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

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

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

Il codice seguente configura la gestione di scorrimenti e clic su un Box focalizzabile:

@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 il focus, quindi viene applicato anche focusTarget per rendere focalizzabile il Box. Puoi utilizzare focusTarget o un altro modificatore che consente il focus, ad esempio surface. Senza il focus, il modificatore non può agire sugli eventi di puntatore indiretti.
  • Questo esempio implementa i callback onSwipeForward e onClick, quindi i gesti di scorrimento e clic rilevati vengono intercettati e utilizzati e non raggiungono i container principali. Tuttavia, puoi anche lasciare un callback specifico nullo per passare un gesto a un modificatore onIndirectPointerGesture in un container principale.