Android 一直都有动画 API,随着系统的发展,动画 API 的数量也在增加,功能也更加全面。针对不同的情况和使用场景,Android 官方在不同的 API 版本和 AndroidX 支持库中都增加补充了很多动画 API 供开发者使用。那么今天就带大家来看看 8 中不同的动画分别是什么?以及它们的使用场景又在哪里?
发展轨迹
- 从 Android 的第一个版本中就存在的是,Android View Animations ,也就是我们熟知的补间动画。
- 然后在 API 11 (Android 3.0)中引入了 Animator API,属性动画,其中包括:Value Animator 和 Object Animator。
- 在之后的小版本更新 API 12 (Android 3.1)中对属性动画进行了增加,引入 View Property Animator。
- 再到 API 19(Android 4.4)增加了 Transitions 动画。
- 在 API 21 (Android 5.0)增加了 Animated Vector Drawable。
- 最后两个是目前存在于 Android X 中的 Physics (物理动画)和 MotionLayout
8 种动画定义及使用场景
1. Android View Animations
Android 古董级别的动画,在 API 1 中就存在了。这种动画只需指定动画开始帧、结束帧,而对于动画中间的过程,都有系统计算来填充的,而无需定义中间的每一帧。
根据 Android Dev Summit ‘18 Android 团队官方人员的介绍,Android View Animations 在目前的开发中应该被弃用,因为该动画可操作的动画属性只有:透明度、缩放、平移、旋转这四种,且动画的对象只能是 View。同时在 View 的绘制体系中经过 Measure、Layout、Draw 之后,View 的真实位置已经确定,而 View Animations 仅仅只能参与到 Draw 这之中,这就意味着我们使用 View Animations 仅是改变了屏幕绘制位置,而真实位置是不变的。例如我们增加点击事件时,响应的区域仍然是 View 之前的位置。
所以由于 View Animations 的功能简陋,以及自身存在的缺陷。官方建议 View Animations 应该被弃用,因为当前已经有了非常好的替代物,那就是 Animator API (属性动画)。
那么 View Animations 就完全没用武之地了吗?
并不是,官方推荐,只有当遇到以下两种场景的时候,可以使用 View Animations 。
因为 window 的动画仅支持 View Animations ,但 Fragment 的自定义动画支持 View Animations 和 Animator API 两种,所以小伙伴们可以根据自己喜好选择使用。
2. Animator API
Animator API 有着更好的通用性,它允许我们修改 View 的属性来制作各种各样的动画。基于 Animator API Android 官方构建了一系列高级动画,例如 RecyclerView 的默认 Item Animtor。如果有人纠结 View Animations 和 Animator 这两个该如何选择时,那么毫无疑问大家该使用 Animator API 来构建动画。
Animator API 的各类关系如下图所示,Animator 类提供了关于创造动画的一系列基本的结构,是一个抽象类。ValueAnimator 是整个属性动画框架的核心类,ValueAnimator 记录了动画的运行时间,位移,当前将要绘制的属性。ObjectAnimator 是 ValueAnimator 的子类,帮助我们可以指定执行动画的 Target,AnimatorSet 动画集合,则用于组织一系列动画的执行。
ViewPropertyAnimator 不是 Animator 的子类,它的存在是基于 ValueAnimator 帮助我们更方便快捷的执行 View 的属性动画。例如我们要在一个 button 上做一个耗时 1s 的透明度动画,下图是使用 ObjectAnimator 和 ViewPropertyAnimator 不同实现方式。二者能实现完全一样的效果,只是实现方式有所区别。
PropertyValuesHolder 这个类的意义就是,它其中保存了动画过程中所需要操作的属性和对应的值。它的使用场景就是在当存在多个动画需要作用到一起执行的时候,我们就可以选择 PropertyValuesHolder,前面说了 AnimatorSet 也是组织一系列动画的执行,所以我们来看一下组合动画的三种实现方式。
组合动画
- ObjectAnimator + AnimatorSet
- PropertyValuesHolder + ObjectAnimator
- ViewPropertyAnimator
我们实现一个在 button 上增加旋转+透明度变化的动画,以下是三种不同实现方式的代码。
如何选择
关于如何选择官方也给出了方案
- ObjectAnimator 是最通用的属性动画 API
- ValueAnimator 用于自定义动画
- ViewPropertyAnimator 当在同一个 View 上实现多个属性修改时可以使用,同时也是最方便简单的
- PropertyValuesHolder 使用它来定义包含多种属性变化的同一套动画,可将这一套动画根据需求作用不同的 target 上
- AnimatorSet 用来组织一系列的动画集合,同时可以更加精确的控制动画
3. Animated Vector Drawable
矢量是可绘制的,因此我们可以以此来做矢量图形动画,例如 Google 的产品中,我们常常会看到有一些小图标,在点击之后,会有一个反馈动画,增加了趣味性同时也可以帮助用户更好的理解功能。
Animated Vector Drawable 是对 Vector Drawable 和 Animator 的封装,使用场景也很简单,作用于 icon 上面的动画。
制作方式
如果你想要制作 Animated Vector Drawable 这里有一个方便的方法交给大家,我们需要用到两个工具 Sketch 和 ShapeShifter。
Sketch 是设计工具,其实任何只要能导出 svg 图片的设计工具都可以。
ShapeShifter 是一个在线的图形编辑工具,我们需要使用 ShapeShifter 对我们用 Sketch 导出的 svg 图片做动画效果。
具体的教程可以参考这篇文章:https://sourcediving.com/android-recipes-the-easy-path-to-animated-icons-878bffcb0920
4. Physics animation
我们都知道 Android 上面的动画大部分看上去很生硬,如果要创建普通动画,则只需持续时间,起始值,结束值和插值器。动画是静态的,持续时间是固定的。动画的速度取决于动画的持续时间和插值器,同时在动画开始之前这些都是提前设置好的,所以我们无法在动画进行的过程中修改动画参数。
而 Physics animation 是引入物理现实意义,动画是受力的作用而驱动的。
例如,我们有一个小球,从 A 点移动到 B 点再到 C 点,采用普通动画的小球从 A 移动到 B,在由 B 移动到 C 的效果会很生硬,而采用 Physics animation 的动画会显示更加敏感和平滑,并减少整体的视觉中断。
5. Transitions
Transitions 主要用于两种状态之间的切换,比如不同 Layout 之前的过渡,窗体之间的共享元素等,关于 Transitions 的使用场景如下图所示。
6. MotionLayout
MotionLayout 是配合 ConstraintLayout 2.0 一起推出的全新组件,主要用于在各种状态之间的布局设置过渡动画。由于 ConstraintLayout 的出现,使 Android 由之前的多层级树形的 Layout 结构,转向了单层级通过约束来确定位置的 Layout 结构。各个控件之间由约束建立关系,通过修改控件之前的约束,我们就可以实现不同布局之间的过渡动画,这就是 MotionLayout 的由来。
MotionLayout 继承自 ConstraintLayout,所以我们可以在 xml 中直接使用 MotionLayout,同时 MotionLayout 中的动画是完全在 xml 中声明好的,不需要任何代码。
使用 MotionLayout 我们需要在 xml 中自定义 MotionScene,在 MotionScene 中指定不同 Layout 之间的变化。
具体的实现我们可以参考官方 GitHub 仓库:https://github.com/android/views-widgets-samples/tree/master/ConstraintLayoutExamples
总结
1. 如果是复杂布局间的协调动画,以及需要手势来进行动画切换,那么推荐使用 MotionLayout。
2. 如果是建立可中断的动画,同时需要保持平滑的过渡,那么推荐使用 Physics。
3. 如果是用于共享元素和窗口内容转换,推荐使用 Transitions。
4. 如果是作用于 icon 的动画,那么推荐使用 Animated Vector Drawable。
5. 如果是用于 Window animation 那么请使用 Android View Animations。
6. 如果是想要通过修改 View 的使用制作动画,那么请使用 ViewPropertyAnimator。
7. 如果是想要自定义动画,那么就使用 ValueAnimator。
8. 最后一个 ObjectAnimator ,它是一种通用的属性动画解决方案。
好了,平时开发中你常用的动画是哪些呢?可以评论告诉我,如果觉得这篇文章有点意思,记得点个在看?。