Compose 动画 (五) : animateContentSize / animateEnterExit / Crossfade / AnimatedContent
1. 前言
AnimatedVisibility
、animateXxxAsState
、animateContentSize
、Crossfade
、AnimatedContent
这几个API,都是Compose
的高级别动画API
,是比较易用的。
上两篇文章我们已经介绍了AnimatedVisibility
,这篇文章我们会介绍剩下的那几个API
。
2. animateContentSize
使用animateContentSize
,可让Compose
组件大小发生变化的时候,具备动画的效果。
比如,我们以下面这个例子为例
var message by remember { mutableStateOf("Hello") }
Column {Button(onClick = {message += "Hello"}) {Text(text = "Change")}Spacer(modifier = Modifier.height(16.dp))Box(modifier = Modifier.background(Color.Blue).padding(10.dp).animateContentSize(),contentAlignment = Alignment.Center) {Text(text = message, color = Color.White)}
}
可以看到效果
当然,我们也可以给动画添加一些特效,比如回弹效果
var message by remember { mutableStateOf("Hello") }
Column {Button(onClick = {message += "Hello"}) {Text(text = "Change")}Spacer(modifier = Modifier.height(16.dp))Box(modifier = Modifier.background(Color.Blue).padding(10.dp).animateContentSize(spring(Spring.DampingRatioHighBouncy)),contentAlignment = Alignment.Center) {Text(text = message, color = Color.White)}
}
关于回弹之类的animationSpec的动画效果,后续的文章会讲到,感兴趣的童鞋可以先关注一波。
注意:animateContentSize 在修饰符链中的位置顺序很重要。为了确保流畅的动画,请务必将其放置在任何大小修饰符(如 size 或 defaultMinSize)前面,以确保 animateContentSize 会将带动画效果的值的变化报告给布局。
3. animateEnterExit
animateEnterExit
需要使用在AnimatedVisibility
里面(直接或间接子项)。
我们可以使用Modifier.animateEnterExit
为每个子项指定不同的动画效果。
比如这里添加的slide
动画会覆盖AnimatedVisibility
设置的fade
动画。
var visible by remember {mutableStateOf(false)}AnimatedVisibility(visible = visible,enter = fadeIn(tween(durationMillis = 2000)),exit = fadeOut(tween(durationMillis = 2000))) {Box(Modifier.fillMaxSize().background(Color.Gray)) {Box(Modifier.align(Alignment.Center).animateEnterExit(enter = slideInVertically(tween(durationMillis = 2000)),exit = slideOutVertically(tween(durationMillis = 2000))).sizeIn(minWidth = 64.dp, minHeight = 64.dp).background(Purple700)) {//Content of the notification...}}}LaunchedEffect(key1 = Unit, block = {delay(2500)visible = true})
效果如下,这里动画的时长设为了2秒,可以看的更清楚一些
有时我们希望AnimatedVisibility
内部每个子组件的过渡动画各不相同,
那么就要为AnimatedVisibility
的enter
与exit
参数分别设置EnterTransition.None
和ExitTransition.None
,然后就可以在每个组件分别指定animateEnterExit
了。
animateEnterExit 显示是试验性质的,将来可能会发生变化,也可能会被完全移除。
4. Crossfade
Crossfade
用来将页面上显示的内容进行切换。
两个交替出现的组件进行渐变的切换,一个消失,而另一个显示出来。
动画效果是淡入淡出,并对尺寸进行处理 (瞬间改变)。
Crossfade
只支持这一种动画效果,是对于AnimatedContent
(我们下面会讲到) 的简化版本。
4.1 Crossfade的使用
我们来试一下
Column(horizontalAlignment = Alignment.CenterHorizontally) {var showPicture by remember { mutableStateOf(false) }Crossfade(targetState = showPicture) {if (it) {Image(painter = painterResource(id = R.mipmap.photot1),modifier = Modifier.width(300.dp),contentDescription = null)} else {Box(Modifier.height(300.dp * 9 / 16).width(300.dp).background(Color.Blue))}}Spacer(modifier = Modifier.height(10.dp))Button(onClick = { showPicture = !showPicture }) {Text(text = "切换")}
}
显示效果
4.2 Crossfade尺寸不一致的情况
如果切换的两个组件,尺寸不一致,就会出现如下情况
如果转场前是大尺寸,转场后是小尺寸,会等转场快结束的时候,变成小尺寸
如果转场前是小尺寸,转场后是大尺寸,会在转场刚开始的时候,变成大尺寸
Column(horizontalAlignment = Alignment.CenterHorizontally) {var showPicture by remember { mutableStateOf(false) }Crossfade(targetState = showPicture) {if (it) {Image(painter = painterResource(id = R.mipmap.photot1),modifier = Modifier.width(300.dp),contentDescription = null)} else {Box(Modifier.size(60.dp).clip(RoundedCornerShape(30.dp)).background(Color.Blue))}}Spacer(modifier = Modifier.height(10.dp))Button(onClick = { showPicture = !showPicture }) {Text(text = "切换")}
}
效果如下所示
5. AnimatedContent
AnimatedContent
用来控制多个组件的入场和出场,同时还能对入场和出场效果做定制
相当于是AnimatedVisibility
和Crossfade
的结合,AnimatedContent
出入场动画效果的尺寸是渐变的,这个是区别于Crossfade
的一个点。
AnimatedContent 显示是试验性质的,将来可能会发生变化,也可能会被完全移除。
Column(horizontalAlignment = Alignment.CenterHorizontally) {var showPicture by remember { mutableStateOf(false) }AnimatedContent(showPicture) {if (it) {Image(painter = painterResource(id = R.mipmap.photot1),modifier = Modifier.width(300.dp),contentDescription = null)} else {Box(Modifier.size(60.dp).clip(RoundedCornerShape(30.dp)).background(Color.Blue))}}Spacer(modifier = Modifier.height(10.dp))Button(onClick = { showPicture = !showPicture }) {Text(text = "切换")}
}
显示效果如下所示
5.1 实现数字增加的效果
使用AnimatedContent
,设置自定义的动画效果,来实现数字增加的效果
Column {var count by remember { mutableStateOf(0) }Button(onClick = { count++ }, Modifier.width(100.dp)) {Text("增加")}Button(onClick = { count-- }, Modifier.width(100.dp)) {Text("减少")}Box(Modifier.size(100.dp).border(1.dp, Color.LightGray).padding(5.dp).background(Color(0xFFF5F5F5)), contentAlignment = Alignment.Center) {AnimatedContent(targetState = count) { targetCount ->Text(text = "$targetCount", fontSize = 20.sp)}}
}
显示效果如下
我们给它设置一个自定义的动画效果
transitionSpec = {if (targetState > initialState) {slideInVertically { height -> height } + fadeIn() withslideOutVertically { height -> -height } + fadeOut()} else {slideInVertically { height -> -height } + fadeIn() withslideOutVertically { height -> height } + fadeOut()}.using(SizeTransform(clip = false))
}
再次运行
6. Compose 动画系列
Compose 动画系列,后续持续更新
Compose 动画 (一) : animateXxxAsState 实现放大/缩小/渐变等效果
Compose 动画 (二) : 为什么animateDpAsState要用val ? MutableState和State有什么区别 ?
Compose 动画 (三) : AnimatedVisibility 从入门到深入
Compose 动画 (四) : AnimatedVisibility 各种入场和出场动画效果
Compose 动画 (五) : animateContentSize / animateEnterExit / Crossfade / AnimatedContent
Compose 动画 (六) : 使用Transition管理多个动画,实现动画预览
Compose 动画 (七) : 高可定制性的动画 Animatable
Compose 动画 (五) : animateContentSize / animateEnterExit / Crossfade / AnimatedContent相关推荐
- Jetpack Compose动画
前面讲到布局基础和图像绘制,本篇来讲下Jetpack Compose动画. 介绍动画主要从下图中几点进行讲解 一.内容动画 与布局内容变化相关的几种动画,官方称之为高级别动画API. Animated ...
- Compose 动画艺术探索之灵动岛
本文为稀土掘金技术社区首发签约文章,14天内禁止转载,14天后未获授权禁止转载,侵权必究! 本篇文章是此专栏的第五篇文章,本篇文章应该是此专栏中最后一篇直接关于动画的文章了,之后文章中可能会提到,但应 ...
- Compose 动画艺术探索之可见性动画
本篇文章是此专栏的第二篇文章,上一篇文章简单写了下 Compose 的动画,让大家先看了下 Compose 开箱即用的动画效果,效果还是挺好的,感兴趣的可以去看下:Compose 动画艺术探索之瞅下 ...
- Compose 动画艺术探索之 Easing
本篇文章是此专栏的第六篇文章,前几篇文章大概将 Compose 中的动画都简单过了一遍,如果想阅读前几篇文章的话可以点击下方链接: Compose 动画艺术探索之瞅下 Compose 的动画 Comp ...
- Compose 动画艺术探索之属性动画
本篇文章是此专栏的第三篇文章,如果想阅读前两篇文章的话请点击下方链接: Compose 动画艺术探索之瞅下 Compose 的动画 Compose 动画艺术探索之可见性动画 Compose的属性动画 ...
- Compose 动画api之我的电子木鱼青春版
提示:需要对基本的compose语法有所了解` 文章目录 前言 一.总体规划 二.我的木鱼 1.敲击监听 pointerInput,detectTapGestures 2.木鱼动画 3.木鱼文字 三. ...
- android添加动画文件,Android开发之图形图像与动画(五)LayoutAnimationController详解
首先需要先介绍下LayoutAnimationController: * 1.LayoutAnimationController用于为一个layout里面的控件,或者是一个ViewGroup * 里面 ...
- android svg路径动画,五、Android SVG动画
SVG的全称是Scalable Vector Graphics(可缩放矢量图形),它不会因为图像放大而失真,且占用内存小,同时搭配Path动画,能够实现一些意想不到的效果. Android中的SVG图 ...
- 3dsmax动画五、自由动画模式。半秒时间节奏点。
①在形体模式(figure mode)下,复制多个到对称位置. 对小腿同理,在local坐标下,在Z轴,Y轴拉伸:如下图: 用同样的方法强壮手臂 首先用本地(local)坐标和世界(world)坐标调 ...
最新文章
- 【blender教程】从头到尾全流程创建一辆吉普车
- 学python最好的方式-自学Python有什么好方法吗?老男孩专业Python培训
- 一键导出/备份「有道云笔记」工具
- hdu Turn the corner
- [内核摘要] 虚拟文件系统
- 3.3、苏宁百万级商品爬取 代码讲解 商品爬取
- DelphiXE4发布了
- mysql show sleep_mysq解决sleep进程过多的办法
- 老板说,我请你来,不是叫你无脑拷贝的,竟然在线上搞出这么大的一个BUG......
- Manjaro/Arch 软件配置安装
- doc-config.php,Suitecrm实施-配置SuiteCRM config.php文件
- spring核心技术之Resource资源理解
- python网络编程内容_图解Python网络编程
- 【图解版】HashMap原理初探
- 英语六级试卷软件测试,背单词软件_2017年12月英语六级考试真题测试(11)含答案_沪江英语...
- 红帽linux内核修复,红帽Linux 7和CentOS 7的新Linux内核更新修复两个错误
- selenium webdriver使用
- php详情页图片尺寸,拼多多主图轮播图详情页图片尺寸要求大全
- python 将函数封装成pyd或者so文件,调用该文件
- fourier feature networks