Skip to content

动画 (Animation)

源:Compose 动画概览

Compose 提供了从简单到复杂的全套动画 API。

依赖配置

Compose 动画库(以及基础布局库)通常通过 Compose BOM 进行版本管理,无需单独指定版本。

kotlin
dependencies {
    implementation(platform("androidx.compose:compose-bom:2024.06.00"))
    
    // 基础动画库 (通常 implementation(libs.androidx.ui) 就已经包含)
    implementation("androidx.compose.animation:animation")
    implementation("androidx.compose.foundation:foundation")
}

1. 快速开始:高级别 API

简单场景首选

这些 API 封装了大多数常见逻辑,开箱即用。

kotlin
// 可见性切换动画
AnimatedVisibility(
    visible = isVisible,
    enter = fadeIn() + expandVertically(),
    exit = fadeOut() + shrinkVertically()
) {
    Text("我会淡入淡出并缩放")
}
kotlin
// 大小变化动画
Box(
    modifier = Modifier
        .animateContentSize() // 只要内部大小变了,就会有平滑过渡
        .padding(16.dp)
) {
    Text(if (expanded) longText else shortText)
}
kotlin
// 两个组件切换(淡入淡出)
Crossfade(targetState = currentPage) { screen ->
    when (screen) {
        "A" -> Text("页面 A")
        "B" -> Text("页面 B")
    }
}

2. 属性动画:animate*AsState

用于对单个数值(Color, Dp, Float, Int, Offset...)的变化进行动画处理。

kotlin
val size by animateDpAsState(
    targetValue = if (selected) 200.dp else 100.dp,
    label = "sizeAnimation"
)

Box(Modifier.size(size).background(Color.Blue))

3. 动画规格 (AnimationSpec)

自定义动画曲线

几乎所有动画 API 都有一个 animationSpec 参数,用于定义动画的具体表现。

  • spring:物理弹簧(默认)。
  • tween:补间动画(指定时长和缓动曲线)。
  • keyframes:多段关键帧。
  • infiniteRepeatable:无限循环。
kotlin
val color by animateColorAsState(
    targetValue = targetColor,
    animationSpec = tween(durationMillis = 1000, easing = LinearEasing)
)

4. 复杂动画:updateTransition

用于同时协调多个属性的变化,或在不同状态间平滑过渡。

示例:展开/收起状态机
kotlin
val transition = updateTransition(targetState = boxState, label = "box")
val size by transition.animateDp { it.size }
val color by transition.animateColor { it.color }
val elevation by transition.animateDp { it.elevation }