kotlin jetpack合成中的onPressIn和onPressOut

xtupzzrd  于 2022-11-25  发布在  Kotlin
关注(0)|答案(2)|浏览(233)

我有按钮记录语音,所以我希望它开始记录时,用户按下它,并停止时,他离开它

@Composable
fun Screen(){
   
   Button(){
      Text("record")
   }

}
a64a0gku

a64a0gku1#

如果你只是问按下/释放动作,我不知道如何用按钮来实现,但你可以用Box(例如)来实现同样的结果,并使用一些修改器来设计你想要的方式...
这里有一个可能的解决方案。

@Composable
fun TestButton() {
    var isPressed by remember {
        mutableStateOf(false)
    }
    Column {
        Box(
            Modifier
                .pointerInput(Unit) {
                    detectTapGestures(
                        onPress = {
                            try {
                                isPressed = true
                                // Start recording here
                                awaitRelease()
                            } finally {
                                isPressed = false
                                // Stop recording here
                            }
                        },
                    )
                }
                .background(
                    MaterialTheme.colors.primary.copy(alpha = if (isPressed) .88f else 1f),
                    MaterialTheme.shapes.small
                )
                .padding(vertical = 8.dp, horizontal = 16.dp)
        ) {
            Text(
                text = "Press me!",
                Modifier.align(Alignment.Center),
                color = MaterialTheme.colors.onPrimary
            )
        }
        Text(text = if (isPressed) "Pressed" else "Unpressed")
    }
}

请注意,我使用的是Box,其设计与Button类似。
结果如下:

uqdfh47h

uqdfh47h2#

要获取Button中的按下/释放操作,您可以使用InteractionSource.collectIsPressedAsState来了解Button是否被按下。
您可以添加一个side effect来了解Button的发布时间。
类似于:

val interactionSource = remember { MutableInteractionSource() }
val isPressed by interactionSource.collectIsPressedAsState()

if (isPressed){
    println("Pressed")
    //Use if + DisposableEffect to wait for the press action is completed
    DisposableEffect(Unit) {
        onDispose {
            println("released")
        }
    }
}

Button(onClick={},
    interactionSource = interactionSource
){
    Text("record")
}

相关问题