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
        )
    }
}
相关推荐
高晶1 小时前
Android 通讯录应用开发实战:从零搭建 SQLite 数据持久化完整项目
android·设计模式·前端框架
隐擎fox2 小时前
深入 Android 移动端风控与协议层对抗:内核级虚拟环境检测、网络堆栈特征伪装与住宅 IP 协同实战
android·网络·python·网络协议·tcp/ip
换元不配限4 小时前
从 AsyncTask 到现代并发:Android 异步方案的演进与替代实践
android·asynctask·异步编程·方案对比·asynctask替代方案
用户2018792831674 小时前
你的 App 为什么是「电量刺客」?——从一条 WakeLock 追到 Linux 内核的 Android 省电原理全解
android
mmsx4 小时前
Android 安全校验下沉到原生层:防 patch 与构建期自动化
android·安全·自动化
老牛日常随笔6 小时前
Google把Android测试搬进AI对话:ARTEMIS如何用自然语言操作你的手机
android·人工智能·智能手机
朱涛的自习室6 小时前
预算 1000 美金的开源软件,DeepSeek 只花 1 美金就做完了(Day 6)
android·前端·人工智能
mmsx7 小时前
Android APK 加固方案怎么落地:从加壳到校验的组合取舍
android·网络·安全·签名