Jetpack Compose - 状态变化时动画重组

问题描述 投票:0回答:1

我在状态更改时为可组合项设置动画时遇到问题。

我有一个可组合项,它接收 Interval (自定义类)和 List 类型的对象。这些是在整个活动使用过程中通过 ViewModel 动态生成的。

intervalanswerOptions 的状态发生变化,让旧版本的可组合项滑出,新版本滑入时,如何为锻炼视图重组设置动画?

@Composable
fun ExerciseView(interval: State<Interval>, answerOptions: State<List<Int>>, audioGenerator: AudioGenerator){
    Column(
        verticalArrangement = Arrangement.Center,
        horizontalAlignment = Alignment.CenterHorizontally
    ) {

        //Composable
        IntervalPlayer(
            interval.value,
            audioGenerator
        )

        //Composable
        OptionButtonList(answerOptions.value, interval.value.semitones - 1)
    }
}

我一直在查看动画文档,但我找不到任何有关自定义对象状态更改的信息,仅针对可见性、颜色、位置和比例等属性。

提前谢谢您!

android android-jetpack-compose android-animation jetpack-compose-animation
1个回答
0
投票

您可以通过将内容包装在 AnimatedContent 中来做到这一点。

data class CustomClass(val number: Int)

@Composable
fun ExerciseScreen() {
    val customState = remember {
        mutableStateOf(CustomClass(1))
    }
    ExerciseView(customState) { customState.value = CustomClass(Random.nextInt()) }
}

@Composable
fun ExerciseView(
    customState: State<CustomClass>,
    onClick: () -> Unit,
) {
    AnimatedContent(
        targetState = customState.value,
        transitionSpec = {
            slideInHorizontally(
                initialOffsetX = { fullWidth -> fullWidth },
            ) togetherWith slideOutHorizontally(
                targetOffsetX = { fullWidth -> -fullWidth },
            )
        },
        label = "Exercise View animation",
        modifier = Modifier.fillMaxSize(),
    ) { state ->
        Column(
            verticalArrangement = Arrangement.Center,
            horizontalAlignment = Alignment.CenterHorizontally,
        ) {
            //Composable
            Button(onClick = onClick) {
                Text(text = state.number.toString())
            }
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.