如何在Jetpack Compose中为悬浮操作按钮添加长按事件?
你的问题出在FloatingActionButton自带的onClick参数会覆盖Modifier里的combinedClickable事件——FAB内部已经通过clickable修饰符实现了点击逻辑,会拦截触摸事件,导致你写的combinedClickable完全触发不了。
下面给两种可行的解决方案:
方案一:移除FAB自带的onClick,使用combinedClickable
直接删掉FloatingActionButton的onClick参数,只保留Modifier上的combinedClickable即可,这样两个事件都能正常触发:
@Composable @ExperimentalFoundationApi fun MyFAB() { FloatingActionButton( modifier = Modifier .combinedClickable( onLongClick = { Log.d(TAG, "onLongClick") // 现在能正常工作 }, onClick = { Log.d(TAG, "onClick") // 现在能正常工作 } ) ) { Icon( imageVector = Icons.Default.Add, contentDescription = "Add item" ) } }
注意:combinedClickable目前属于实验性API,需要添加@ExperimentalFoundationApi注解,或者在gradle中配置相关实验性开关。
方案二:使用pointerInput实现(非实验性API)
如果不想依赖实验性API,可以用pointerInput手动处理触摸事件,通过手势检测器区分长按和单击:
@Composable fun MyFAB() { FloatingActionButton( onClick = {} // 必须传空实现,否则FAB会默认拦截事件 ) { Icon( imageVector = Icons.Default.Add, contentDescription = "Add item", modifier = Modifier .pointerInput(Unit) { detectTapGestures( onLongPress = { Log.d(TAG, "onLongClick") }, onTap = { Log.d(TAG, "onClick") } ) } ) } }
这里要注意:FloatingActionButton的onClick不能省略,必须传一个空实现,否则它依然会拦截事件,导致内部Icon的pointerInput接收不到触摸信号。
内容的提问来源于stack exchange,提问作者Always Learner
相关产品推荐
相关产品推荐

