Jetpack Compose 动画updateTransition

在 Jetpack Compose 中,updateTransition 是一个功能强大的高级动画 API,用于管理多个相互关联的属性动画。它通过维护一个状态机(State Machine),当状态发生改变时,能够同步驱动多个属性(如大小、颜色、透明度、偏移量等)平滑过渡。

一、 核心作用与优势

  • 多属性联动(协同动画)当界面从一个状态切换到另一个状态(例如:折叠 →\rightarrow→
    展开)时,往往需要同时改变多个视觉属性。updateTransition`
    允许你基于同一个状态源统一管理这些属性,保持所有子动画的步调一致。
  • 自动处理中断与平滑过渡如果在动画执行中途状态再次发生变化,updateTransition 会自动从当前的插值位置平滑过渡到新的目标状态,而不会出现视觉上的突兀跳跃或闪烁。
  • 清晰的状态机模型它非常适合处理多状态的复杂交互(如 Idle、Pressed、Loading、Success 等),使代码逻辑比维护多个独立的 animatable 更加清晰和结构化。

二、 典型使用示例

以下代码展示了如何使用 updateTransition 让一个方块在 Collapsed(折叠)和 Expanded(展开)两种状态之间切换时,同时改变其尺寸和背景颜色:

复制代码
enum class BoxState {
    Collapsed,
    Expanded
}

@Composable
fun AnimatedBox(currentState: BoxState) {
    // 1. 创建 Transition 对象,绑定目标状态
    val transition = updateTransition(targetState = currentState, label = "BoxTransition")

    // 2. 使用 transition 提供的扩展函数定义子动画
    val size by transition.animateDp(label = "SizeAnimation") { state ->
        when (state) {
            BoxState.Collapsed -> 60.dp
            BoxState.Expanded -> 200.dp
        }
    }

    val color by transition.animateColor(label = "ColorAnimation") { state ->
        when (state) {
            BoxState.Collapsed -> Color.Blue
            BoxState.Expanded -> Color.Red
        }
    }

    // 3. 将动画属性应用到 UI 组件
    Box(
        modifier = Modifier
            .size(size)
            .background(color)
    )
}

三、 updateTransition vs animate*AsState

特性 animate*AsState(如 animateDpAsState) updateTransition
适用场景 针对单个独立的属性进行简单的状态触发动画。 针对多个属性需要基于同一个状态进行联动变化的场景。
代码结构 每一个变化的属性都需要独立声明一个状态变量。 声明一个 transition 核心对象,所有子动画在其中统一管理。
状态感知 只能感知自身值的变化。 可以通过 transition.currentState 和 transition.targetState 随时获取当前和目标的完整状态。
相关推荐
用户2018792831672 小时前
给主厨装一台打卡机:一文搞懂 Android APM 性能监控原理
android
我不会插花弄玉3 小时前
8. 复合查询【由浅入深-MySQL】
android·数据库·mysql
熊文豪3 小时前
机器人开发者生态分析:行业分工变化与启元的定位
android·机器人·启元机器人
郑州光合科技余经理3 小时前
同城商城源码:商品库和订单库怎么随包交付
android·java·开发语言·后端·uni-app·php·ai编程
蒸鱼Yuzheng4 小时前
移动游戏功耗与能效归因:帧率、画质、温控和续航如何一起评估
android·性能测试·功耗优化·游戏性能·温控
hai_android5 小时前
Android 设备锁定:Kiosk Mode 实战
android·java·android jetpack
我不会插花弄玉5 小时前
9. 表的内连和外连【由浅入深-MySQL】
android·数据库·mysql
嘟哩DuliDuli5 小时前
剧本节点输入归一化:文本来源、版本与下游引用
android·人工智能·安全·ai·软件工程