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 随时获取当前和目标的完整状态。
相关推荐
好的佩奇23 分钟前
蓝牙之广播与扫描
android·flutter·蓝牙
传奇开心果编程2 小时前
【Jetpack Compose娓娓道来】第36课:焦点管理与键盘输入——让遥控器、键盘和输入法都“找得到北”
android·kotlin·移动开发·交互·android jetpack·ui框架·声明式ui
hai_android3 小时前
AudioTrack 深度解析:从原理到实战
android·java·kotlin
红尘伴蝶舞3 小时前
从秒开优化到连环崩溃:深入剖析 ViewPager2 在常驻 DialogFragment 中的复用陷阱与自愈方案
android·kotlin
巫山老妖8 小时前
Android 应用架构演进:MVC / MVP / MVVM / MVI (2026)
android·android jetpack
木头左12 小时前
【架构设计】教育类 App 服务端化改造:AI 上移、题库分层与个人题库归属
android·架构设计·系统设计·后端开发·数据库设计
墨狂之逸才12 小时前
USB 的 HOST 和 DEVICE 到底有什么区别?ADB 调试应该选哪个?
android
奶油话梅糖13 小时前
苹果的内核跑上了安卓手机:2,631 Star 的 HakiOS 让 XNU 在 Adreno GPU 上画出 118 帧
android·macos·智能手机
恋猫de小郭13 小时前
Flutter THLC 的 WebView 滚动终于从 70 FPS 提升到 120 FPS
android·前端·flutter
好的佩奇1 天前
Dart 之扩展类型
android·flutter·dart