Jetpack Compose 动画animate*AsState

在 Jetpack Compose 中,animate*AsState(如 animateDpAsState、animateColorAsState、animateFloatAsState 等)是最简单、最常用的单值动画 API。

它可以将一个普通的值(如大小、颜色、透明度等)包装成一个动画状态。每当目标状态发生改变时,它会自动从当前值平滑过渡到新值。

一、 核心作用与特点

针对单一属性的快速动画

如果你只需要让某个单独的属性(比如点赞按钮变大一点、背景颜色改变、透明度淡入淡出)动起来,用它最合适、最轻量。

声明式与自动化

你不需要手动管理动画的启动、结束或监听器。只需将数据状态绑定到 animate*AsState,当状态改变时,Compose 会在每一帧自动重组并更新 UI。

自动中断处理

如果在动画播放到一半时目标值又发生了变化,它会从当前的位置无缝过渡到新的目标值,不会产生突兀的跳跃。

二、 常见变体

根据你想要动画化的数据类型,Compose 提供了对应的扩展方法:

animateDpAsState:用于尺寸、边距等 (Dp)

animateColorAsState:用于颜色 (Color)

animateFloatAsState:用于缩放比例、透明度等 (Float)

animateIntAsState:用于计数值、网格列数等 (Int)

animateOffsetAsState:用于位置偏移 (Offset)

三、 典型使用示例

以下代码展示了如何使用 animateDpAsState 和 animateColorAsState 实现一个点击后改变大小和颜色的按钮:

复制代码
@Composable
fun SimpleAnimationButton() {
    // 1. 定义一个控制状态的布尔值
    var isExpanded by remember { mutableStateOf(false) }

    // 2. 使用 animate*AsState 为尺寸和颜色创建动画状态
    val size by animateDpAsState(
        targetValue = if (isExpanded) 180.dp else 100.dp,
        label = "SizeAnimation"
    )

    val color by animateColorAsState(
        targetValue = if (isExpanded) Color.Magenta else Color.Blue,
        label = "ColorAnimation"
    )

    // 3. 点击切换状态,并将动画值应用到 UI
    Box(
        modifier = Modifier
            .size(size)
            .background(color)
            .clickable { isExpanded = !isExpanded },
        contentAlignment = Alignment.Center
    ) {
        Text(
            text = if (isExpanded) "点击收起" else "点击展开",
            color = Color.White
        )
    }
}
相关推荐
好的佩奇11 小时前
Dart 之扩展类型
android·flutter·dart
alexhilton13 小时前
2027 Android 开发者路线图:学习、面试与 AI
android·kotlin·android jetpack
灿飞屋15 小时前
Kotlin与Java虚拟机三:控制流
android·java·开发语言·后端·python·kotlin·安卓
疯华整猫16 小时前
我用 Trae 把 Android 内存账重算了一遍
android·性能优化·源码
TimeFine17 小时前
AI 编程工作流的设计:从人工判断到 AI裁判
android·ai编程
阿杰m18 小时前
Android源码第四章:Android 系统启动——App 的第一行代码从哪来?
android
疯华整猫1 天前
混淆起初根本不是为了防破解:我用 Trae 把 Android 混淆这二十来年重跑了一遍
android·人工智能·计算机视觉
Carson带你学Android1 天前
AI时代,你的 App 会被 Agent 这三种方式调用
android·ai编程
恋猫de小郭1 天前
Flutter 下 AOT 一个你怎么都想不出来的 Bug ,JIT 正常的计算,在 AOT 居然算错了
android·前端·flutter
好的佩奇2 天前
Dart 之扩展方法
android·flutter·dart