借助 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修饰符。