在Jetpack Compose中,当文本被点击时,我需要开始旋转文本.协程运行,当它完成时,动画应该停止.

到目前为止,我有:

    var isRotating by remember { mutableStateOf(false) }
    val angle = animateFloatAsState(
        targetValue = if (isRotating) 360f else 0f,
        animationSpec = infiniteRepeatable(tween(2000, easing = LinearEasing))
    )

    Box(
        modifier = Modifier
            .graphicsLayer { rotationZ = angle.value }
            .clickable {
                isRotating = true
                coroutineScope.launch {
                    doSlowProcess()
                    isRotating = false
                }
            }
        ) {
            Text("START")
        }

文本"Start"应该旋转,直到"doSlowProcess"运行.它开始旋转,但当它结束时,它并没有停止,只是以另一种方式开始旋转,速度更慢,当达到0°时,它翻转180度,然后继续.如果我再次单击它,它会进行正确的旋转,但在0°时会向前 skip 90°.我猜,如果当"isRotating"变为假时停止旋转,这些"异常"就会消失.我应该如何正确地开始和停止轮换?

推荐答案

你可以用一些不同的东西:

var isRotating by remember { mutableStateOf(false) }
val angle = remember {
    Animatable(0f)
}
LaunchedEffect(isRotating) {
    launch {
        if (isRotating) {
            angle.animateTo(
                targetValue = 360f,
                animationSpec = infiniteRepeatable(
                    tween(2000, easing = LinearEasing)
                )
            )
        }
    }
}

Kotlin相关问答推荐

何时使用figureEach

在Kotlin 有更好的结合方式?

如何在不基于数据 map 的情况下将图例添加到lets plot kotlin

用Quarkus和Reactor重写异步过滤器中的数据流

在 map 中查找键与在 kotlin 中查找 firstOrNull

使用事务时未调用 Kafka ConsumerInterceptor onCommit

每个 Kotlin 版本的默认 Kotlin 语言版本是什么?

如何在 Kotlin 中将with代码转换为完整代码?

测试协程和线程之间的差异,我在kotlin中使用线程时无法得到OOM错误

比较 Kotlin 中的可比对象列表

Kotlin 中的数据类

包括登录Elvis operator?

将 Firebase 数据快照反序列化为 Kotlin 数据类

Android Studio 和 Kotlin:Unresolved reference: also

在java代码中使用kotlin库

如何捕获传递给模拟函数的参数并返回它?

API 26 上未显示 Android 通知

Kotlin reflect proguard SmallSortedMap

lateinit 的 isInitialized 属性在伴随对象中不起作用

使用 Moshi/Retrofit2 访问深度嵌套的 JSON 数组