手把手教你写 Compose 动画 -- 组件大小变化 API:animateContentSize

news2024/11/15 11:06:18

Jetpack Compose 提供了一系列功能强大且可扩展的 API,可用于在应用界面中轻松实现各种动画效果。这一系列文章会逐个介绍所有的动画 API,通过最直观的 Demo 示例,手把手教你怎么写动画以及带你了解动画背后的原理。


📑 手把手教你写 Compose 动画 - - 状态转移型动画 API:animate*AsState()

📑 手把手教你写 Compose 动画 - - 流程定制型动画 API:Animatable()

📑 手把手教你写 Compose 动画 - - 讲的不能再细的 AnimationSpec 动画规范

📑 手把手教你写 Compose 动画 - - 过渡动画 API:Transition

📑 手把手教你写 Compose 动画 - - 显示与消失 API:AnimatedVisibility

📑 手把手教你写 Compose 动画 - - 简单页面切换动画 API:Crossfade

📑 手把手教你写 Compose 动画 - - 更强大的多组件切换动画 API:AnimatedContent

📑 手把手教你写 Compose 动画 - - 组件大小变化 API:animateContentSize



📓 动画图表


在每一篇文章开头,我都会放一张 Compose 动画 API 的图表,以便你有最直观的感受。

在这里插入图片描述


📓 animateContentSize()


animateContentSize 修饰符可为 Compose 组件大小变化时添加动画效果。

还是那句话:探索新技术的最佳方式是尝试它们,我们先构建一个简单场景:

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        setContent {
            animateContentSizeTest()
        }
    }
}

@Composable
fun animateContentSizeTest() {
    var longString by remember { mutableStateOf(false) }
    val text by remember(longString) {
        mutableStateOf(
            if (longString) "Hi, Compose, this is long description!"
            else "Hi, Compose!"
        )
    }
    Column (
        modifier = Modifier.fillMaxWidth(),
        verticalArrangement = Arrangement.Center,
        horizontalAlignment = Alignment.CenterHorizontally
    ) {
        Spacer(modifier = Modifier.height(100.dp))

        Button(
            onClick = {
                longString = !longString
            }
        ) {
            Text(text = "改变 Text 长度")
        }

        Box(
            Modifier
                .background(Color.Green)) {
            Text(text = text)
        }
    }
}

现在你看这段代码应该毫无压力了,我们看下效果:

在这里插入图片描述

可以看出来,Box 的长度会随着 Text 组件的文字长度而变化,但是这种长度变化很明显没有动画效果。

如果我们想让 Box 组件长度变化也有动画效果的话,就可以使用 animateContentSize 修饰符。

既然是修饰符,那肯定就是用在 Modifier 中的,所以代码写起来也很简单:

Box(
    Modifier
        .background(Color.Green)
        .animateContentSize()) {  // 只需要对 Box 添加 Modifier.animateContentSize()
    Text(text = text)
}

就这么简单,我们看下效果:

在这里插入图片描述

animateContentSize() 的用法就这么简单,我们再来看下它的定义:

fun Modifier.animateContentSize(
    animationSpec: FiniteAnimationSpec<IntSize> = spring(),
    finishedListener: ((initialValue: IntSize, targetValue: IntSize) -> Unit)? = null
)

它同样可以自行设定动画曲线(默认是弹簧效果 - - 不弹),现在我们试下它能够弹的效果:

Box(
    Modifier
        .background(Color.Green)
        .animateContentSize(animationSpec = spring(Spring.DampingRatioHighBouncy))) {
    Text(text = text)
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1312960.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Python】解读a+=b 和 a=a+b是否一样?看完恍然大悟!

文章目录 前言一、可变对象和不可变对象总结 前言 在Python中&#xff0c;对于可变和不可变对象的行为差异是一个重要概念&#xff0c;特别是在涉及到和操作时。理解这一点对于编写高效且无误的代码至关重要。 一、可变对象和不可变对象 首先&#xff0c;让我们谈谈可变和不可…

Webstorm使用方法

标题一 安装步骤 1.打开JetBrans官方网站&#xff08;https://www.jetbrains.com/webstorm&#xff09;并下载适用于您操作系统的WebStorm安装程序 2.运行下载的安装程序 3.再安装程序中选择您想要安装WebStorm的位置&#xff0c;并接收软件许可协议 4.接下来您可以选择要安…

python中else的细节

if-else 首先我们都知道else可以和if共同使用&#xff0c;如果if条件没有执行&#xff0c;就会去执行else语句 a100 if a100:print("if 语句执行了") else:print("else语句执行了") a10 if a100:print("if 语句执行了") else:print("else…

计算机组成原理---浮点数的加减运算

这是本人的做法&#xff0c;不喜勿喷&#xff01;

mac 安装nvm以及切换node版本详细步骤

1、nvm介绍&#xff08;node版本管理工具&#xff09; nvm 可以让你通过命令行快速安装和使用不同版本的node 有时候项目太老&#xff0c;node版本太高,执行npm install命令会报错,可以借助nvm切换低版本的node。 2、安装nvm 在终端执行安装命令 curl -o- https://raw.gith…

Linux route命令详解

1、介绍 route命令用于显示和操作IP路由表&#xff0c;它允许用户查看当前系统的路由信息&#xff0c;添加新的路由、删除已有的路由等。 2、命令 2.1 命令选项 -n, --numeric&#xff1a;不解析主机名&#xff0c;直接显示IP地址。使用这个选项可以加快显示速度&#xff0…

蓝凌EIS智慧协同平台 SQL注入漏洞复现

0x01 产品简介 蓝凌EIS智慧协同平台是一款专为企业提供高效协同办公和团队合作的产品。该平台集成了各种协同工具和功能&#xff0c;旨在提升企业内部沟通、协作和信息共享的效率。 0x02 漏洞概述 由于蓝凌EIS智慧协同平台 UniformEntry.asp接口处未对用户输入的SQL语句进行…

DeepStream--调试Gstreamer

DeepStream是基于Gstreamer开发的。有时候需要在Gstreamer加日志&#xff0c;比如想在rtpjitterbuffer里加日志。 首先&#xff0c;执行gst-inspect-1.0 rtpjitterbuffer命令。 从结果中可以看到&#xff0c;rtpjitterbuffer插件的源码是gst-plugins-good&#xff0c;版本是1…

广州华锐互动:VR煤矿安全操作规程实训提升矿工安全意识与技能

随着科技的不断发展&#xff0c;虚拟现实&#xff08;VR&#xff09;技术已经逐渐渗透到各个领域&#xff0c;为人们的生活带来了极大的便利。在煤矿行业&#xff0c;VR技术的应用也日益受到重视&#xff0c;尤其是在煤矿安全检查方面。为了提高矿工的安全意识和技能&#xff0…

springboot自定义starter步骤

引入相关依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional> </dependency><dependency><groupId>org.pro…

(基础篇)通过node增删改查连接mysql数据库

一定要会最基础的sql建表一定要会最基础的sql建表一定要会最基础的sql建表 首先说一下准备工作 一、准备工具 1.mysql数据库Navicat可视化工具&#xff08;数据库表单已经建好&#xff09; 我这里用的小皮工具直接开启的本地mysql 2.vscode (不用说基本上都有) 3.node.js …

C语言学习----指针和数组

&#x1f308;这篇blog记录一下指针学习~ 主要是关于指针和数组之间的关系&#xff0c;还有指针的使用等~ &#x1f34e;指针变量是一个变量 其本身也有一个地址 也需要存放&#xff0c;就和int char等类型一样的&#xff0c;也需要有一个地址来存放它 &#x1f34c;而指针变量…

自动生成采集规则的网页采集器

传统的采集器配置采集规则&#xff0c;需要查看网页源码&#xff0c;这要求用户具备一定的编程知识&#xff0c;增加了使用难度&#xff0c;也让很多不懂代码的用户无法采集数据了。 然而&#xff0c;现在有一种智能网页采集器工具&#xff1a;简数采集器&#xff0c;无需懂代…

Mapreduce小试牛刀(2)--java api

1.同hdfs 的java api,我们首先要在IDE中建立一个maven项目 pom.xml中配置如下&#xff1a; <dependencies><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-mapreduce-client-common</artifactId><version>3.…

TS系列-keyof的妙用

案例1 1、如果&#xff0c;有一个接口&#xff0c;某个变量的类型&#xff0c;是这个接口的 key &#xff1f; keyof 后面可以跟 一个对象类型或者一个接口类型keyof 是把后面 对象或者接口 的 键 都提取出来&#xff0c;组成一个联合类型 interface IStudentAttr {name: stri…

低代码开发如何快速构建AI应用

随着人工智能&#xff08;AI&#xff09;的快速发展&#xff0c;越来越多的企业和开发者开始意识到AI在业务和应用中的重要性。然而&#xff0c;AI应用的开发通常被认为是复杂和耗时的过程&#xff0c;需要大量的编码和数据科学知识。为了解决这个问题&#xff0c;低代码开发平…

嵌入式C语言变量、数组、指针初始化的多种操作

在敲代码的时候&#xff0c;我们会给变量一个初始值&#xff0c;以防止因为编译器的原因造成变量初始值的不确定性。 对于数值类型的变量往往初始化为0&#xff0c;但对于其他类型的变量&#xff0c;如字符型、指针型等变量等该如何初始化呢&#xff1f; 数值类变量初始化 整…

如何掌握热门话题视频号的秘诀

在今天的数字化时代&#xff0c;社交媒体已经成为人们获取信息、分享观点和娱乐的主要平台之一。其中&#xff0c;微信视频号因其独特的功能和广泛的用户基础&#xff0c;成为了许多人展示自我、实现梦想的重要途径。那么&#xff0c;如何才能成功地运营一个热门话题的视频号呢…

docker-harbor的私有仓库

目录 harbor的特性 harbor的组件 docker-harbor部署 Docker1 页面访问 ​编辑 上传镜像 创建项目 创建用户 给项目创建成员 上传私有仓库 docker2(远程主机上传) 如何实现仓库之间进行同步 docker3 实现远程仓库同步 仓库 保存镜像 私有&#xff0c;自定义用户…

TSINGSEE青犀城市道路积水AI检测算法视频智能监管解决方案

近年来&#xff0c;由于城市区域内涝频发&#xff0c;遇到强降水天气出现路面严重积水的情况时有发生&#xff0c;影响交通通行甚至引发事故。所以&#xff0c;对下穿隧道、下沉式道路等路面积水情况的监测显得尤为重要。传统的监管方式很难及时发现道路积水情况&#xff0c;那…