动画 (Animation)
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 }