Obsługa pośrednich danych wejściowych wskaźnika w Jetpack Compose Glimmer

Odpowiednie urządzenia z XR
Te wskazówki pomogą Ci tworzyć treści na te typy urządzeń z XR.
Okulary z wyświetlaczem

Modyfikator onIndirectPointerGesture umożliwia komponentowi odbieranie zdarzeń wskaźnika pośredniego wysokiego poziomu, takich jak te pochodzące z touchpada urządzenia, i reagowanie na nie. Użyj tego modyfikatora, aby przechwytywać i przetwarzać gesty pochodzące z touchpada lub podobnego źródła.

Interfejs API

Aplikacja może używać 4 wywołań zwrotnych do kontrolowania obsługi:

  • onClick: wywoływane po kliknięciu bez znaczącego ruchu w poziomie.
  • onSwipeForward: aktywowane, gdy przesunięcie poziome przekroczy próg odległości i prędkości w kierunku do przodu.
  • onSwipeBackward: aktywowane, gdy przesunięcie poziome przekroczy próg odległości i prędkości w kierunku wstecz.
  • Enabled: gdy ma wartość false, modyfikator jest ignorowany i nie są wywoływane żadne wywołania zwrotne.

Działanie systemu podczas przesuwania i przewijania

System używa progu przesunięcia dotykowego, aby odróżnić kliknięcie od przesunięcia palcem.

  • Jeśli wskaźnik znacznie się przesunie, gdy jest wciśnięty, zdarzenie onClick zostanie anulowane.
  • Jeśli podczas ruchu wskaźnik znacznie się cofnie, gest przesunięcia zostanie unieważniony.

Przykład: konfigurowanie obsługi przesunięć i kliknięć komponentu

Poniższy kod konfiguruje obsługę przesunięć i kliknięć na elemencie Box, który można zaznaczyć:

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

Najważniejsze informacje o kodzie

  • onIndirectPointerGesture wymaga zaznaczenia, więc stosowany jest też atrybut focusTarget, aby umożliwić zaznaczenie elementu Box. Możesz użyć focusTarget lub innego modyfikatora, który umożliwia ustawienie fokusu, np. surface. Bez zaznaczenia modyfikator nie może reagować na zdarzenia pośredniego wskaźnika.
  • W tym przykładzie zaimplementowano wywołania zwrotne onSwipeForward i onClick, dzięki czemu wykryte gesty przesunięcia i kliknięcia są przechwytywane i wykorzystywane, a nie przekazywane do kontenerów nadrzędnych. Możesz też pozostawić konkretne wywołanie zwrotne jako null, aby przekazać gest do modyfikatora onIndirectPointerGesture w kontenerze nadrzędnym.