Jetpack Compose 动画Crossfade

在 Jetpack Compose 中,Crossfade 是一个专为不同内容或布局之间的交叉淡入淡出(Cross-fade)切换设计的轻量级动画 API。

当你的界面需要在两个(或多个)不同的 Composable 状态之间切换,并且希望旧内容淡出、新内容淡入时,Crossfade 可以用极少的代码实现极其平滑的视觉过渡。

一、 核心作用与特点

  1. 内容平滑交叉淡入淡出
    它会自动处理旧内容的淡出(Alpha 从 1 降到 0)和新内容的淡入(Alpha 从 0 升到 1),两者的切换是同时进行且无缝衔接的。
  2. 基于状态 Key 的驱动
    你只需传入一个目标状态(比如一个枚举值、布尔值或整型 ID)。当这个 Key 发生变化时,Crossfade 会自动触发内部的淡入淡出动画。
  3. 替代复杂的手动 Visibility 控制
    相比于写多个 AnimatedVisibility 去控制互斥显示,Crossfade 专门针对"二选一"或"多选一"的内容替换场景进行了封装,代码更加简洁。

二、 典型使用示例

以下代码展示了如何使用 Crossfade 实现底部 Tab 切换或视图状态切换(例如在"首页"和"个人中心"之间切换):

复制代码
enum class ScreenType {
    Home, Profile
}

@Composable
fun CrossfadeDemo() {
    // 1. 定义控制当前显示内容的视图状态
    var currentScreen by remember { mutableStateOf(ScreenType.Home) }

    Column(
        modifier = Modifier.padding(16.dp),
        horizontalAlignment = Alignment.CenterHorizontally
    ) {
        // 切换按钮
        Row(modifier = Modifier.padding(bottom = 16.dp)) {
            Button(onClick = { currentScreen = ScreenType.Home }) {
                Text("首页")
            }
            Spacer(modifier = Modifier.width(8.dp))
            Button(onClick = { currentScreen = ScreenType.Profile }) {
                Text("个人中心")
            }
        }

        // 2. 使用 Crossfade 包裹内容切换区域
        Crossfade(
            targetState = currentScreen,
            animationSpec = tween(durationMillis = 400),
            label = "ScreenCrossfade"
        ) { screen ->
            // 3. 根据不同的 targetState 渲染对应的 UI
            when (screen) {
                ScreenType.Home -> {
                    Box(
                        modifier = Modifier
                            .fillMaxWidth()
                            .height(150.dp)
                            .background(Color.Blue, RoundedCornerShape(8.dp)),
                        contentAlignment = Alignment.Center
                    ) {
                        Text("🏠 欢迎来到首页内容", color = Color.White, fontSize = 18.sp)
                    }
                }
                ScreenType.Profile -> {
                    Box(
                        modifier = Modifier
                            .fillMaxWidth()
                            .height(150.dp)
                            .background(Color.Magenta, RoundedCornerShape(8.dp)),
                        contentAlignment = Alignment.Center
                    ) {
                        Text("👤 个人中心与设置页面", color = Color.White, fontSize = 18.sp)
                    }
                }
            }
        }
    }
}
相关推荐
2401_833269301 小时前
Android歌词功能实现
android
恋猫de小郭2 小时前
Flutter 紧急发布 3.47.8 安全升级版本,建议都升级
android·前端·flutter
YB13752 小时前
Jetpack Compose 动画AnimatedContent
android
美狐美颜SDK开放平台12 小时前
准备开发直播APP?视频美颜SDK接入前的十项检查清单
android·ios·音视频·直播美颜sdk·视频美颜sdk
传奇开心果编程13 小时前
【Jetpack Compose娓娓道来】第26课:Repository模式与数据层设计——数据的唯一入口
android·移动开发·1024程序员节·jetpack compose·编程语言理论·编程框架·声明式ui
三少爷的鞋17 小时前
Kotlin 协程,重点就在「协」这个字上
android·kotlin
好的佩奇18 小时前
Dart 之模式
android·flutter·dart
淡淡的香烟19 小时前
Flutter实现多语言切换
android·flutter·1024程序员节
AIsoft_868921 小时前
手机视频转文字工具清单:哪些APP支持录屏识别
android·音视频