如何检测长按
Button(
onClick = onClick,
interactionSource = interactionSource,
modifier = Modifier
.combinedClickable(
onClick = onClick,
onLongClick = onLongClick
)
)
这行不通。 onClick 是必需的,我猜它会消耗combinedClickable。我还需要一个交互源。 我宁愿避免创建自定义按钮。
它不适用于
Button
,因为与您无法链接的原因相同 Modifier.clickable{}.clickable{}
使用
Button
添加另一个 Modifier.pointerInput()
不会产生任何效果,因为 Button
是一个带有 onClick 参数的 Surface
,并且已经分配了 Modifier.clickable()
。 Modifier.clickable
已经消耗了事件并且不允许其他 Modifier.pointerInput()
接收它。
在 Jetpack Compose 中,当有两个或多个
Modifier.pointerInput()
链接在一起时,底部的第一个接收事件,默认为 pass,即 PointeEventPass.Main
。因为 clickable 已经消耗了,所以你分配的人永远不会得到它。
最简单的方法是使用 InteractionSource 并将其收集为
@Preview
@Composable
private fun ButtonLongClickSample() {
val context = LocalContext.current
val interactionSource = remember { MutableInteractionSource() }
val viewConfiguration = LocalViewConfiguration.current
LaunchedEffect(interactionSource) {
var isLongClick = false
interactionSource.interactions.collectLatest { interaction ->
when (interaction) {
is PressInteraction.Press -> {
isLongClick = false
delay(viewConfiguration.longPressTimeoutMillis)
isLongClick = true
Toast.makeText(context, "Long click", Toast.LENGTH_SHORT).show()
}
is PressInteraction.Release -> {
if (isLongClick.not()) {
Toast.makeText(context, "click", Toast.LENGTH_SHORT).show()
}
}
}
}
}
Button(
onClick = {},
interactionSource = interactionSource
) {
Text("Some button")
}
}
你可以试试这个
modifier = Modifier
.weight(2f)
.pointerInput(Unit){
detectTapGestures(
onLongPress = {
// perform some action here..
}
)
}