Jetpack Compose Android 按钮检测长按

kkk*_*kkk 1 android button kotlin android-jetpack android-jetpack-compose

如何检测长按

    Button(
    onClick = onClick,
    interactionSource = interactionSource,
    modifier = Modifier
        .combinedClickable(
            onClick = onClick,
            onLongClick = onLongClick
        )
)
Run Code Online (Sandbox Code Playgroud)

这是行不通的。onClick 是必需的,我猜它会消耗combinedClickable。我还需要一个交互源。我宁愿避免创建自定义按钮。

Thr*_*ian 5

Button由于与无法链接的原因相同,它无法使用Modifier.clickable{}.clickable{}

添加Button另一个Modifier.pointerInput()不会有任何效果,因为已经分配了 onClickButton参数。已经消耗了事件并且不允许其他人接收它。SurfaceModifier.clickable()Modifier.clickableModifier.pointerInput()

在 Jetpack Compose 中,当有两个或多个Modifier.pointerInput()链接在一起时,底部的第一个接收事件,默认传递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")
    }
}
Run Code Online (Sandbox Code Playgroud)