如何在Activity启动时为Jetpack Compose组件添加入场动画?
实现Jetpack Compose启动时Text淡入动画
问题原因
直接用AnimatedVisibility(visible = true)没效果,是因为Compose初始渲染时状态就是true,动画需要状态从false到true的切换才会触发。
方案1:AnimatedVisibility + LaunchedEffect
初始把可见性设为false,组件加载后再切换为true,触发淡入:
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { AppTheme { Surface( modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background ) { val isVisible = remember { mutableStateOf(false) } // 首次组合后触发状态切换,可选加延迟让动画更自然 LaunchedEffect(Unit) { delay(100) isVisible.value = true } AnimatedVisibility( visible = isVisible.value, // 自定义淡入动画时长,这里设为1秒 enter = fadeIn(tween(1000)) ) { Text(text = "Message") } } } } }
方案2:直接控制透明度动画
用animateFloatAsState控制Text的透明度从0到1,实现淡入:
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { AppTheme { Surface( modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background ) { // 动画从0(完全透明)过渡到1(完全不透明),时长1秒 val alpha = animateFloatAsState( targetValue = 1f, animationSpec = tween(1000), initialValue = 0f ) Text( text = "Message", modifier = Modifier.alpha(alpha.value) ) } } } }
额外提示
- 想加更复杂的入场效果,比如淡入+从右侧滑入,可以在
AnimatedVisibility的enter里组合动画:fadeIn() + slideInHorizontally(initialOffsetX = { it * 2 }) tween参数里可以加缓动曲线,比如tween(1000, easing = FastOutSlowInEasing)让动画更流畅
内容的提问来源于stack exchange,提问作者Narek Torosyan
相关产品推荐
相关产品推荐

