Android 动画在开发中是不可或缺的功能,或者说是界面灵动的添加剂。那你是否总结过 Android 中总共为开发者提供了多少种方式的动画呢?今天就为你们总结概括一下。android
我话音未落,前排那位骚气不减当年、故事布满双眼的大胸弟就激动得高高举起了那只尽是老茧的右手:“我知道,我知道!都有平移动画、缩放动画、旋转动画、渐变更画、还有......”git
看着这位兄弟回答时专一又左思右想的表情,我真不忍心伤害他那颗纯真的幼当心灵。因而我决定说一个谎:“这位同窗,你说的太对了!你都知道的这么全面了还出来听课真是太辛苦了。这么热的天,不如回家吹吹空调、吃吃西瓜,把此次学习的机会让给更须要的人不挺好吗!”github
看着那位兄弟一脸知足后远去的欢快背影,我终于能够放心的开始今天重点了。好了,上面内容纯属扯淡,转入正题。网络
本文章一部分教程图片来自网络,在这里先对这些图片的做者表示感谢。app
Android 动画能够概括为如下几种:框架
上面动画分类是我的经过每种动画种类概念的独立性来划分的,目前能想到的只有这么多,若是有所遗漏你们能够指点出来以供我后续完善。less
可能有不少人迅速的反应出,缺乏了目前使用也相对较多的 airbnb/lottie-android 动画。不可置疑,Lottie 库目前在 Android 开发中尤为复杂动画效果上地位显著。但咱们今天要是的 Android 原生上为咱们提供的能使用的动画方式,Lottie 动画今天暂且搁置。同时对于 RecyclerView item 加载动画今天也暂且不提。咱们且把这些动画归为其余,并非把它们遗忘了。ide
对于上面列举的动画种类,可能你们对部分较经常使用的动画早已熟练应用,好比 View 动画、属性动画等。而对部分较少使用(好比 揭露动画)、或者经常使用却从未意识到它也属于动画的一种(好比 触摸反馈动画)知道的并非那么全面。“那么今天就一一为你们详细讲解每种动画的概念”,那是不可能滴~~,就这么点篇幅,这么可能把每种动画都细说下来。svg
要这些动画一一梳理清晰,那将是一项浩大的工做,而我已经为你们总结成了一个《详尽 Android 动画系列教程》,你们能够到
https://github.com/OCNYang/Android-Animation-Set
进行查看,因为动画知识点涉及的太多而教程详细程度使人发指,你们能够收藏起来慢慢查看。另外总结的教程中每种动画都提供了动画示例,你们能够结合源码细细品味。(上面总结的系列教程,大多数都是借用前人总结的教程,选用的都是针对每种动画网上流传的最详细全面的教程,在梳理中对部分错误也进行了更正。)oop
那今天的任务是什么呢?接下来主要经过粗略的介绍来说解每种动画在开发中都适用在哪一种场景。
自从有了属性动画,View 动画的处境就很是凄凉,但有时咱们须要的仅仅就是简易的动画效果,那咱们使用 View 动画起来就十分便捷。
View 动画的一个特色就是,他的动画仅仅是动的 View 的绘制地方,View 真正的位置并无一块儿动画。
View 通常会用做直接做用页面中的 View 上,实现基本的动画效果:平移、旋转、缩放、透明度、或前几者的交集:
除了这几种用法还有几种特殊的使用场景:
你们能够对比一下默认动画和设置后的动画效果对比:
Activity 过场动画效果能够经过不少方式设置,而使用 View 动画实现的方式就是借助设置overridePendingTransition(int enterAnim, int exitAnim)
方法。跟在 startActivity() 或 finish() 后面,在页面转换时就显示上面方法设置的切换动画效果。
效果对比:
就是经过给 ViewGroup 控件设置一条 android:layoutAnimation="@anim/anim_layout"
的属性。而 anim_layout
就是 ViewGroup 中子控件在第一次显示时的进场动画效果。
效果以下:
LayoutAnimation 适用于全部的 ViewGroup ,天然也包含 ListView、RecyclerView 等控件。上面说过 LayoutAnimation 提供的是进场动画效果,因此只在 ViewGroup 第一次加载子 View 时显示一次,因此列表控件的 item 加载动画咱们通常不使用它,咱们会使用 列表 专门的 Item 加载动画, 好比 recyclerView.setItemAnimator() 等。
帧动画这个很好理解,其实就和看的动画片同样,每一帧表明一个画面动做,当快速逐帧显示时,速度到达人眼没法分辨每一帧时,就达到了动画的效果。
在使用中,先要准备好每一帧的素材图片:
而后播放出来就成了动画的效果:
要提及帧动画的使用场景,在开发中使用的真是少之又少,通常会有两种:
之因此说开机动画是帧动画。是由于通常开机动画是经过 system/media/bootanimation.zip 这个压缩包,bootanimation 里面主要包含一个 desc.txt 以及 N 个文件夹。而文件夹里面放着的就是开机动画的图片资源。decs.txt 的做用就是指导系统如何去执行开机动画。
desc.txt 编写规范,例如开机动画须要用到 2 个文件夹,分别是 folder1 和 folder2,开机的时候,先把 folder1 里面的图片都播放一遍,而后再循环播放 folder2 里面的文件,直到进入系统。
而在开发中,开机动画咱们通常涉及不到的。而经常使用到的是,当咱们须要一些比较复杂的图片动画显示效果时,其余动画又实现不了,这时咱们能够考虑帧动画,但要注意防止 OOM。
其实真正用到帧动画时,更多的时候咱们还不如使用 GIF 图片代替,如今几个主流图片加载框架都支持 GIF 图片,同时也能控制 GIF 的播放时机。
属性动画所提供的功能和 View 动画十分类似。但二者在实现原理上彻底不一样,而相对 View 动画来讲,属性动画要强大的许多。这里咱们先对二者作个对比:
View 动画/视图动画:
属性动画
那属性动画的使用场景有哪些呢?
属性动画是功能更强大、实现方式更优雅的动画解决方案,在为自定义 View 设置动效上有着很是强大的表现能力,能够实现 View 动画实现不了的更加炫酷的动画效果。详细的属性动画介绍能够去查看 《Android 动画详尽教程》系列。
这里盗一张前段时间有位网友实现的灵动的红鲤鱼效果,具体的实现也用到了很多属性动画的原理。
所谓触摸反馈动画就是一种点击效果,做用在可点击的 View 上时,当有点击事件时会有涟漪般的反馈效果,使用在 按钮 上是再好不过了。
Ripple 波纹效果有两种:
//有边界 ?android:attr/selectableItemBackground //无边界 (要求API21以上) ?android:attr/selectableItemBackgroundBorderless
效果分别为:
使用也很是简单,只要将上面两种效果设置为控件的背景或者前景就行了,同时须要给控件设置点击事件、或把控件设置为可点击 android:clickable="true"
揭露动画在系统中很常见,就是相似波纹的效果, 从某一个点向四周展开或者从四周向某一点聚合起来。
以下图使用时的一些效果:
若是加上些 View 动画效果,结合后成这样:
同时它还能够和下面要说的转场动画结合成下面更酷炫的效果:
上面动画效果是:先使用转场动画的共享元素转场,而后再使用揭露动画显示 View。
转场动画听名字就知道它的使用场景了,转场、转场天然是用在场景转换的时候:
共同元素[注1]:并不是限制指做用的两个共享元素的状态、大小、显示位置彻底相同。而是指二者在页面中要传递的内容相同,好比是从文章列表转到文章详情页面时的相同标题、主图等。若是共享元素的二者是不一样的元素,一方面在显示时共享元素在将结束转场完成转换时会有显示的闪动,另外一方面,若是二者表达的是不一样的元素,用户也会感到很莫名。
话很少说,放上效果图:
所谓视图状态动画,就是 View 在状态改变时执行的动画效果。和以前咱们经过 selector 选择器给 Button 设置不一样状态下的背景效果是同样同样的。
固然,它的使用场景也是特定的:
放上一个按钮被点击后设置的视图状态动画:
不知道你们如今在开发中,在图标显示上是否是还在切各类尺寸的 .png 图片适配。如今我但是一直在使用 svg 图标(在开发中是经过转换成 Vector 再使用,如今 AS 中导入,能够自动完成转换,转换不成功的再用上面网址转换),svg 图标的好处自不用说了。那矢量图动画有是怎么回事呢?
VectorDrawable 通常是以 <vector>
为根标签订义的 XML 文件,<vector>、<group>、<clip-path>、<path>
元素都有各自能够播放动画的属性。具体怎么生成具备动画效果的图标,能够在系列教程中查看。
咱们能够在如下场景使用:
这个动画就比较新了,甚至连官方都没有提供完整的文档。这是经过 ConstraintLayout 实现的一种关键帧动画。
关键帧动画:(百度百科)任何动画要表现运动或变化,至少先后要给出两个不一样的关键状态,而中间状态的变化和衔接电脑能够自动完成,在 Flash 中,表示关键状态的帧动画叫作关键帧动画
所谓关键帧动画,就是给须要动画效果的属性,准备一组与时间相关的值,这些值都是在动画序列中比较关键的帧中提取出来的,而其余时间帧中的值,能够用这些关键值,采用特定的插值方法计算获得,从而达到比较流畅的动画效果。
而 ConstraintSet 动画既然实现的是关键帧动画,那至少须要两个关键帧,而对于 ConstraintSet 来讲每次须要的两个关键帧就是两种布局状态,而两种布局状态的转变过程 ConstraintSet 会生成必定的动画过渡。
那使用场景根据约束动画的说明也比较明显了,就是同一个布局须要从新调整布局内部 View 位置时使用。
这里介绍的只是对 Android 各个种类的动画进行了一个简单的介绍,若是你要更加详细更加全面的查看 Android 各个动画的系列教程,能够到本文章同系列文章教程进行查看:
Android 动画详尽教程:https://github.com/OCNYang/Android-Animation-Set
本篇教程终于完了,这时我又想起了文章开头那个大胸弟,我想他此刻确定在家正洋洋得意的啃着大西瓜。很少说了,如此炎热的天气,我也要去啃个西瓜抚慰一下狂躁的心。