1. 前言

AnimatedVisibilityanimateXxxAsStateanimateContentSizeCrossfadeAnimatedContent 这几个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内部每个子组件的过渡动画各不相同,
那么就要为AnimatedVisibilityenterexit参数分别设置EnterTransition.NoneExitTransition.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用来控制多个组件的入场和出场,同时还能对入场和出场效果做定制
相当于是AnimatedVisibilityCrossfade的结合,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相关推荐

  1. Jetpack Compose动画

    前面讲到布局基础和图像绘制,本篇来讲下Jetpack Compose动画. 介绍动画主要从下图中几点进行讲解 一.内容动画 与布局内容变化相关的几种动画,官方称之为高级别动画API. Animated ...

  2. Compose 动画艺术探索之灵动岛

    本文为稀土掘金技术社区首发签约文章,14天内禁止转载,14天后未获授权禁止转载,侵权必究! 本篇文章是此专栏的第五篇文章,本篇文章应该是此专栏中最后一篇直接关于动画的文章了,之后文章中可能会提到,但应 ...

  3. Compose 动画艺术探索之可见性动画

    本篇文章是此专栏的第二篇文章,上一篇文章简单写了下 Compose 的动画,让大家先看了下 Compose 开箱即用的动画效果,效果还是挺好的,感兴趣的可以去看下:Compose 动画艺术探索之瞅下 ...

  4. Compose 动画艺术探索之 Easing

    本篇文章是此专栏的第六篇文章,前几篇文章大概将 Compose 中的动画都简单过了一遍,如果想阅读前几篇文章的话可以点击下方链接: Compose 动画艺术探索之瞅下 Compose 的动画 Comp ...

  5. Compose 动画艺术探索之属性动画

    本篇文章是此专栏的第三篇文章,如果想阅读前两篇文章的话请点击下方链接: Compose 动画艺术探索之瞅下 Compose 的动画 Compose 动画艺术探索之可见性动画 Compose的属性动画 ...

  6. Compose 动画api之我的电子木鱼青春版

    提示:需要对基本的compose语法有所了解` 文章目录 前言 一.总体规划 二.我的木鱼 1.敲击监听 pointerInput,detectTapGestures 2.木鱼动画 3.木鱼文字 三. ...

  7. android添加动画文件,Android开发之图形图像与动画(五)LayoutAnimationController详解

    首先需要先介绍下LayoutAnimationController: * 1.LayoutAnimationController用于为一个layout里面的控件,或者是一个ViewGroup * 里面 ...

  8. android svg路径动画,五、Android SVG动画

    SVG的全称是Scalable Vector Graphics(可缩放矢量图形),它不会因为图像放大而失真,且占用内存小,同时搭配Path动画,能够实现一些意想不到的效果. Android中的SVG图 ...

  9. 3dsmax动画五、自由动画模式。半秒时间节奏点。

    ①在形体模式(figure mode)下,复制多个到对称位置. 对小腿同理,在local坐标下,在Z轴,Y轴拉伸:如下图: 用同样的方法强壮手臂 首先用本地(local)坐标和世界(world)坐标调 ...

最新文章

  1. 【blender教程】从头到尾全流程创建一辆吉普车
  2. 学python最好的方式-自学Python有什么好方法吗?老男孩专业Python培训
  3. 一键导出/备份「有道云笔记」工具
  4. hdu Turn the corner
  5. [内核摘要] 虚拟文件系统
  6. 3.3、苏宁百万级商品爬取 代码讲解 商品爬取
  7. DelphiXE4发布了
  8. mysql show sleep_mysq解决sleep进程过多的办法
  9. 老板说,我请你来,不是叫你无脑拷贝的,竟然在线上搞出这么大的一个BUG......
  10. Manjaro/Arch 软件配置安装
  11. doc-config.php,Suitecrm实施-配置SuiteCRM config.php文件
  12. spring核心技术之Resource资源理解
  13. python网络编程内容_图解Python网络编程
  14. 【图解版】HashMap原理初探
  15. 英语六级试卷软件测试,背单词软件_2017年12月英语六级考试真题测试(11)含答案_沪江英语...
  16. 红帽linux内核修复,红帽Linux 7和CentOS 7的新Linux内核更新修复两个错误
  17. selenium webdriver使用
  18. php详情页图片尺寸,拼多多主图轮播图详情页图片尺寸要求大全
  19. python 将函数封装成pyd或者so文件,调用该文件
  20. fourier feature networks

热门文章

  1. 認識母親,發現自己 ~ ------------转自CJCHT Clare CJCHT-NEWS的文章
  2. python侯先生爬楼梯_侯先生上位记
  3. Android直播APP源码中排行榜功能如何实现
  4. 如何构建以应用为核心的运维体系
  5. 舵机内部结及工作原理浅析
  6. selenium java api 中文_Selenium Java WebDriverAPI 接口操作
  7. 奶爸日记18 - 公园餐厅
  8. 接私活被公司开除了。。。
  9. 电脑计算机怎么没有桌面显示器,电脑显示器没有图标怎么办
  10. 卸载vsto插件的方法