Gérer les entrées de pointeur indirectes dans Jetpack Compose Glimmer

Appareils XR concernés
Ces conseils vous aideront à créer des expériences pour ces types d'appareils XR.
Lunettes avec affichage

Le modificateur onIndirectPointerGesture permet au composant de recevoir des événements de pointeur indirects de haut niveau, tels que ceux provenant du pavé tactile d'un appareil, et d'y répondre. Utilisez ce modificateur pour capturer et traiter les gestes provenant d'un pavé tactile ou d'une source similaire.

Surface d'API

Votre application peut utiliser quatre rappels pour contrôler la gestion :

  • onClick : déclenché en cas d'appui ou de clic réussi sans mouvement horizontal significatif.
  • onSwipeForward : déclenché lorsqu'un balayage horizontal dépasse le seuil de distance et de vitesse dans la direction avant.
  • onSwipeBackward : déclenché lorsqu'un balayage horizontal dépasse le seuil de distance et de vitesse dans le sens inverse.
  • Enabled : lorsque ce paramètre est défini sur false, le modificateur est ignoré et aucun rappel n'est appelé.

Comportement du système pour le balayage et le défilement

Le système utilise un seuil de tolérance tactile pour différencier un clic d'un balayage.

  • Si le pointeur se déplace de manière significative pendant un état enfoncé, onClick est annulé.
  • Si le pointeur revient en arrière de manière significative pendant un mouvement, le geste de balayage est invalidé.

Exemple : Configurer la gestion des balayages et des clics sur un composant

Le code suivant configure la gestion des balayages et des clics sur un Box sélectionnable :

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

Points clés concernant le code

  • onIndirectPointerGesture nécessite d'avoir le focus. Par conséquent, focusTarget est également appliqué pour rendre Box sélectionnable. Vous pouvez utiliser focusTarget ou un autre modificateur permettant d'activer la sélection, tel que surface. Sans sélection, le modificateur ne peut pas agir sur les événements de pointeur indirects.
  • Cet exemple implémente les rappels onSwipeForward et onClick. Ainsi, les gestes de balayage et de clic détectés sont interceptés et utilisés, et n'atteignent pas les conteneurs parents. Toutefois, vous pouvez également laisser un rappel spécifique nul pour transmettre un geste à un modificateur onIndirectPointerGesture dans un conteneur parent.