animateFloatAsState 是 Compose 中最常用的基于 float 的过渡动画 API。轻松驱动数值、颜色、尺寸变化,让 UI 生动流畅。本课拆解三种核心用法。
| 动画类型 | 目标值 | 核心参数 | 典型场景 |
|---|---|---|---|
| 数值动画 | Float | targetValue, animationSpec | 进度条、透明度、旋转角度 |
| 颜色动画 | Color (通过 .toArgb 或 lerp) | 配合 animateColorAsState 或手动转换 | 主题切换、状态指示 |
| 尺寸动画 | Dp / Float | targetValue 映射到 size / offset | 卡片展开、按钮缩放 |
// ===== 1. 数值动画:透明度 / 旋转 =====
var isVisible by remember { mutableStateOf(true) }
val alpha: Float by animateFloatAsState(
targetValue = if (isVisible) 1f else 0.2f,
animationSpec = tween(600, easing = FastOutSlowInEasing)
)
// ===== 2. 颜色动画 (通过 animateColorAsState) =====
var isActive by remember { mutableStateOf(false) }
val bgColor: Color by animateColorAsState(
targetValue = if (isActive) Color(0xFFD8824A) else Color(0xFFF5DDCD),
animationSpec = spring(dampingRatio = 0.6f)
)
// ===== 3. 尺寸动画 (宽度/高度) =====
var expanded by remember { mutableStateOf(false) }
val widthDp: Float by animateFloatAsState(
targetValue = if (expanded) 280f else 120f,
animationSpec = tween(400, easing = LinearEasing)
)
// 使用: Modifier.size(widthDp.dp, 80.dp)
@Composable
fun ColorAnimationBox() {
var toggled by remember { mutableStateOf(false) }
val bg by animateColorAsState(
targetValue = if (toggled) Color(0xFFF5A97F) else Color(0xFFB8D4E3),
animationSpec = spring(dampingRatio = 0.5f)
)
Box(
modifier = Modifier
.size(120.dp)
.background(bg, shape = RoundedCornerShape(24.dp))
.clickable { toggled = !toggled }
)
}