# Android 一共有多少种动画?准确告诉你!  Android 动画在开发中是不可或缺的功能,或者说是界面灵动的添加剂。那你是否总结过 Android 中总共为开发者提供了多少种方式的动画呢?今天就为大家总结归纳一下。  我话音未落,前排那位骚气不减当年、故事布满双眼的大胸弟就激动得高高举起了那只满是老茧的右手:“我知道,我知道!都有平移动画、缩放动画、旋转动画、渐变动画、还有......” 看着这位兄弟回答时专注又冥思苦想的表情,我真不忍心伤害他那颗纯真的幼小心灵。于是我决定说一个谎:“这位同学,你说的太对了!你都知道的这么全面了还出来听课真是太辛苦了。这么热的天,不如回家吹吹空调、吃吃西瓜,把这次学习的机会让给更需要的人不挺好吗!” 看着那位兄弟一脸满足后远去的欢快背影,我终于可以放心的开始今天重点了。好了,上面内容纯属扯淡,转入正题。 > 本文章一部分教程图片来自网络,在这里先对这些图片的作者表示感谢。 ## 动画种类 Android 动画可以归纳为以下几种: * [视图动画(View 动画)](#1) * [帧动画(Frame 动画、Drawable 动画)](#2) * [属性动画](#3) * [触摸反馈动画(Ripple Effect)](#4) * [揭露动画(Reveal Effect)](#5) * [转场动画 & 共享元素(Activity 切换动画)](#6) * [视图状态动画(Animate View State Changes)](#7) * [矢量图动画(Vector 动画)](#8) * [约束布局实现的关键帧动画(ConstraintSet 动画)](#9) 上面动画分类是个人通过每种动画种类概念的独立性来划分的,目前能想到的只有这么多,如果有所遗漏大家可以指点出来以供我后续完善。 可能有很多人迅速的反应出,缺少了目前使用也相对较多的 **[airbnb/lottie-android](https://github.com/airbnb/lottie-android)** 动画。不可置疑,Lottie 库目前在 Android 开发中尤其复杂动画效果上地位显著。但我们今天要是的 Android 原生上为我们提供的能使用的动画方式,Lottie 动画今天暂且搁置。同时对于 RecyclerView item 加载动画今天也暂且不提。我们且把这些动画归为其他,并不是把它们遗忘了。 ## 详尽教程 对于上面列举的动画种类,可能大家对部分较常用的动画早已熟练应用,比如 View 动画、属性动画等。而对部分较少使用(比如 揭露动画)、或者常常使用却从未意识到它也属于动画的一种(比如 触摸反馈动画)知道的并不是那么全面。“那么今天就一一为大家详细讲解每种动画的概念”,那是不可能滴~~,就这么点篇幅,这么可能把每种动画都细说下来。 要这些动画一一梳理清晰,那将是一项浩大的工作,而我已经为大家总结成了一个**《详尽 Android 动画系列教程》**,大家可以到 [https://github.com/OCNYang/Android-Animation-Set](https://github.com/OCNYang/Android-Animation-Set) 进行查看,由于动画知识点涉及的太多而教程详细程度令人发指,大家可以收藏起来慢慢查看。另外总结的教程中每种动画都提供了动画示例,大家可以结合源码细细品味。(上面总结的系列教程,大多数都是借用前人总结的教程,选用的都是针对每种动画网上流传的最详细全面的教程,在梳理中对部分错误也进行了更正。) 那今天的任务是什么呢?接下来主要通过粗略的介绍来讲解每种动画在开发中都适用在哪种场景。
* 2. **给 Activity 设置页面跳转、退出动画效果**:
Activity 过场动画效果可以通过很多方式设置,而使用 View 动画实现的方式就是借助设置
`overridePendingTransition(int enterAnim, int exitAnim)` 方法。跟在 startActivity() 或 finish() 后面,在页面转换时就显示上面方法设置的切换动画效果。
效果对比:
* 3. **给 ViewGroup 设置子控件的进场动画效果**:
就是通过给 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 的播放时机。
使用也非常简单,只要将上面两种效果设置为控件的背景或者前景就好了,同时需要给控件设置点击事件、或把控件设置为可点击 `android:clickable="true"`