0

我最近开始使用 jet pack compose 制作动画,并且想知道如何制作它,以便当您增加偏移量中的值时,一旦动画达到该值,它就会将该值更改为另一个值。所以就像更新过渡,但不是同时,一个接一个。

4

3 回答 3

1

实际上@RaBaKa 的答案是部分正确的,但它缺少有关如何运行动画的信息。

它应该作为副作用来完成。例如,您可以使用LaunchedEffect: 它已经在协程范围内运行。一个接一个地运行一个动画是完全正常的——一旦第一个挂起函数完成,第二个就会启动:

val value = remember { Animatable(0f) }
LaunchedEffect(Unit) {
    value.animateTo(
        20f,
        animationSpec = tween(2000),
    )
    value.animateTo(
        10f,
        animationSpec = tween(2000),
    )
}
Text(value.value.toString())

如果您想响应某些操作(例如按下按钮)执行此操作,则需要自己运行协程。最主要的是在同一个协程中运行动画,以便它们被链接起来。

val value = remember { Animatable(0f) }
val scope = rememberCoroutineScope()
Button(onClick = {
    scope.launch {
        value.animateTo(
            20f,
            animationSpec = tween(2000),
        )
        value.animateTo(
            10f,
            animationSpec = tween(2000),
        )
    }
}) {
    
}
Text(value.value.toString())
于 2022-02-08T05:13:35.927 回答
1

正确的答案是使用 kotlin 协程,我设法让它工作正常,你必须使用协程才能以正确的顺序启动动画,所以它看起来像

   animationRoutine.launch {
                                    coroutineScope {
                                        launch {
                                            animate(
                                                startingValue,
                                                targetValue,
                                                animationSpec = whatYouWant,
                                                block = { value, _ -> whateverYouNeed = value })

                                        }
                                        launch {
                                            animate(
                                                initialValue,
                                                targetValue,
                                                animationSpec = whatYouWant,
                                                block = { value, _ -> whateverYouNeed = value })

                                        }
                                    }

如果您告诉它允许您在较低级别一次运行多个动画并对动画进行排序,则每个启动范围都以非阻塞方式启动所有内容,您可以为动画的下一部分添加另一个协程。

于 2022-02-08T10:01:09.637 回答
0

也许你可以使用Animatable

val value = remember { Animatable(0f) }    //Initial Value

然后在撰写中你可以使用

value.animateTo(20f)

然后

value.animateTo(10f) 

更多信息请访问官方文档

于 2022-02-07T15:29:06.743 回答