在 Jetpack Compose Glimmer 中处理间接指针输入

适用的 XR 设备
本指南可帮助您为以下类型的 XR 设备打造优质体验。
显示眼镜

借助 onIndirectPointerGesture 修饰符,组件可以接收和响应高级间接指针事件,例如源自设备触控板的事件。使用此修饰符可捕获和处理来自触控板或类似来源的手势。

API Surface

您的应用可以使用四个回调来控制处理:

  • onClick:在成功点按或点击且没有明显水平移动时触发。
  • onSwipeForward:当水平滑动在向前方向上超过距离和速度阈值时触发。
  • onSwipeBackward:当水平滑动在向后方向上超过距离和速度阈值时触发。
  • Enabled:如果设置为 false,则系统会忽略修饰符,并且不会调用任何回调。

滑动和滚动时的系统行为

系统会使用触摸溢出阈值来区分点击和滑动。

  • 如果指针在按下状态期间发生明显移动,则 onClick 会被取消。
  • 如果指针在移动过程中明显回退,则滑动手势无效。

示例:设置对组件滑动和点击的处理

以下代码设置了对可聚焦 Box 的滑动和点击的处理:

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

代码要点

  • onIndirectPointerGesture 需要焦点,因此还应用了 focusTarget,以使 Box 可聚焦。您可以使用 focusTarget 或其他可启用焦点的修饰符,例如 surface。如果没有焦点,修饰符就无法对间接指针事件执行操作。
  • 此示例同时实现了 onSwipeForward 和 onClick 回调,因此检测到的滑动和点击手势会被拦截和使用,而不会向外到达父级容器。不过,您也可以将特定回调留空,以便将手势传递给父容器中的 onIndirectPointerGesture 修饰符。