Indirekte Zeigereingaben in Jetpack Compose Glimmer verarbeiten

XR‑Geräte, für die der Leitfaden gilt
Dieser Leitfaden hilft Ihnen dabei, Erlebnisse für die folgenden Arten von XR-Geräten zu entwickeln.
Audio- und
Displaybrillen

Der onIndirectPointerGesture Modifikator lässt die Komponente indirekte Zeigerereignisse auf hoher Ebene empfangen und darauf reagieren, z. B. Ereignisse, die vom Touchpad eines Geräts stammen. Mit diesem Modifikator können Sie Gesten erfassen und verarbeiten, die von einem Touchpad oder einer ähnlichen Quelle stammen.

API-Oberfläche

Es gibt vier Callbacks, mit denen Ihre App die Verarbeitung steuern kann:

  • onClick: Wird bei einem erfolgreichen Tippen oder Klicken ohne erhebliche horizontale Bewegung ausgelöst.
  • onSwipeForward: Wird ausgelöst, wenn ein horizontaler Wisch den Schwellenwert für Entfernung und Geschwindigkeit in Vorwärtsrichtung überschreitet.
  • onSwipeBackward: Wird ausgelöst, wenn ein horizontaler Wisch den Schwellenwert für Entfernung und Geschwindigkeit in Rückwärtsrichtung überschreitet.
  • Enabled: Wenn auf false gesetzt, wird der Modifikator ignoriert und es werden keine Callbacks aufgerufen.

Systemverhalten beim Wischen und Scrollen

Das System verwendet einen Schwellenwert für die Touch-Verzögerung, um zwischen einem Klick und einem Wischen zu unterscheiden.

  • Wenn sich der Zeiger während eines „Down“-Zustands erheblich bewegt, wird onClick abgebrochen.
  • Wenn der Zeiger während einer Bewegung erheblich zurückkehrt, wird die Wischbewegung ungültig.

Beispiel: Verarbeitung für Wischbewegungen und Klicks auf einer Komponente einrichten

Mit dem folgenden Code wird die Verarbeitung für Wischbewegungen und Klicks auf einem fokussierbaren Box-Element eingerichtet:

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

Wichtige Punkte zum Code

  • onIndirectPointerGesture erfordert den Fokus. Daher wird auch focusTarget angewendet, um das Box fokussierbar zu machen. Sie können focusTarget oder einen anderen Modifikator verwenden, der den Fokus aktiviert, z. B. surface. Ohne Fokus kann der Modifikator nicht auf indirekte Zeigerereignisse reagieren.
  • In diesem Beispiel werden sowohl die Callbacks onSwipeForward als auch onClick implementiert. Daher werden erkannte Wisch- und Klickbewegungen abgefangen und verarbeitet und erreichen keine übergeordneten Container. Sie können jedoch auch ein bestimmtes Callback auf Null lassen, um eine Touchgeste an einen onIndirectPointerGesture-Modifikator in einem übergeordneten Container zu übergeben.