如何在没有 onActive 的情况下启动自动启动动画,并设置animatedFloatAsState 的初始值

时间:2021-04-04 13:49:40

标签: android android-jetpack-compose

过去(在 alpha11 之前),我可以在触发可组合函数时为从 0 到 1 的值设置动画,如下所示,我可以在其中设置 initialValue 并且还具有 onActive 和 {{1} }.

aniumateTo

但是,现在在 alpha13 中,我找不到设置 val animatedProgress = animatedFloat(0f) onActive { animatedProgress.animateTo( targetValue = 1f, anim = infiniteRepeatable( animation = tween(durationMillis = 2000, easing = LinearEasing), ) ) } val t = animatedProgress.value initialValue 的方法。 animateTo 现在也已弃用。

我编码如下

onActive

我怎么能...

  • 设置初始值为 0
  • 开始动画(不需要状态布尔值来启动它)
  • 重复从 0 到 1 的动画

2 个答案:

答案 0 :(得分:2)

您可以使用 Animatable API 和 LaunchedEffect 组合。您不需要布尔值来启动动画。

类似于:

val animatedAlpha = remember { Animatable(0f) }

Box(
    Modifier
        .background(color = (Color.Blue.copy(alpha = animatedAlpha.value)))
        .size(100.dp,100.dp)

)

LaunchedEffect(animatedAlpha) {
    animatedAlpha.animateTo(1f,
        animationSpec = infiniteRepeatable(
            animation = tween(durationMillis = 2000, easing = LinearEasing)
        ))
}

enter image description here

答案 1 :(得分:0)

看起来我必须使用布尔值来更改状态并使用 LaunchEffect 来启动和更改状态,如下所示。

    var start by remember{ mutableStateOf(false) }

    val floatAnimation = animateFloatAsState(
        targetValue = if (start) 1f else 0f,
        animationSpec = infiniteRepeatable(
            animation = tween(durationMillis = 2000, easing = LinearEasing),
        )
    )
    LaunchedEffect(true) {
        start = true
    }

    val t = floatAnimation.value

不确定这是否是最好的编码方式。