Android 一直都有动画 API,随着系统的发展,动画 API 的数量也在增加,功能也更加全面。针对不同的情况和使用场景,Android 官方在不同的 API 版本和 AndroidX 支持库中都增加补充了很多动画 API 供开发者使用。那么今天就带大家来看看 8 中不同的动画分别是什么?以及它们的使用场景又在哪里?

android 动效 旋转图标 安卓旋转动画_android 动效 旋转图标

发展轨迹

  1. 从 Android 的第一个版本中就存在的是,Android View Animations ,也就是我们熟知的补间动画。
  2. 然后在 API 11 (Android 3.0)中引入了 Animator API,属性动画,其中包括:Value Animator 和 Object Animator。
  3. 在之后的小版本更新 API 12 (Android 3.1)中对属性动画进行了增加,引入 View Property Animator。
  4. 再到 API 19(Android 4.4)增加了 Transitions 动画。
  5. 在 API 21 (Android 5.0)增加了 Animated Vector Drawable。
  6. 最后两个是目前存在于 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 之前的位置。

android 动效 旋转图标 安卓旋转动画_android 动效 旋转图标_02

所以由于 View Animations 的功能简陋,以及自身存在的缺陷。官方建议 View Animations 应该被弃用,因为当前已经有了非常好的替代物,那就是 Animator API (属性动画)。

那么  View Animations 就完全没用武之地了吗?

并不是,官方推荐,只有当遇到以下两种场景的时候,可以使用 View Animations 。

android 动效 旋转图标 安卓旋转动画_android 动效 旋转图标_03

因为 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 动画集合,则用于组织一系列动画的执行。

android 动效 旋转图标 安卓旋转动画_android 动效 旋转图标_04

ViewPropertyAnimator 不是 Animator 的子类,它的存在是基于 ValueAnimator 帮助我们更方便快捷的执行 View 的属性动画。例如我们要在一个 button 上做一个耗时 1s 的透明度动画,下图是使用 ObjectAnimator 和 ViewPropertyAnimator 不同实现方式。二者能实现完全一样的效果,只是实现方式有所区别。

android 动效 旋转图标 安卓旋转动画_让一个动画一直执行的属性是_05

PropertyValuesHolder 这个类的意义就是,它其中保存了动画过程中所需要操作的属性和对应的值。它的使用场景就是在当存在多个动画需要作用到一起执行的时候,我们就可以选择 PropertyValuesHolder,前面说了 AnimatorSet 也是组织一系列动画的执行,所以我们来看一下组合动画的三种实现方式。

组合动画

  1. ObjectAnimator + AnimatorSet
  2. PropertyValuesHolder + ObjectAnimator
  3. ViewPropertyAnimator

我们实现一个在 button 上增加旋转+透明度变化的动画,以下是三种不同实现方式的代码。

android 动效 旋转图标 安卓旋转动画_android 动效 旋转图标_06

如何选择

关于如何选择官方也给出了方案

android 动效 旋转图标 安卓旋转动画_android 动效 旋转图标_07

  • ObjectAnimator 是最通用的属性动画 API
  • ValueAnimator 用于自定义动画
  • ViewPropertyAnimator 当在同一个 View 上实现多个属性修改时可以使用,同时也是最方便简单的
  • PropertyValuesHolder 使用它来定义包含多种属性变化的同一套动画,可将这一套动画根据需求作用不同的 target 上
  • AnimatorSet 用来组织一系列的动画集合,同时可以更加精确的控制动画

3. Animated Vector Drawable

矢量是可绘制的,因此我们可以以此来做矢量图形动画,例如 Google 的产品中,我们常常会看到有一些小图标,在点击之后,会有一个反馈动画,增加了趣味性同时也可以帮助用户更好的理解功能。

android 动效 旋转图标 安卓旋转动画_android 动效 旋转图标_08

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 的动画会显示更加敏感和平滑,并减少整体的视觉中断。

android 动效 旋转图标 安卓旋转动画_android 动效 旋转图标_09

5. Transitions

Transitions 主要用于两种状态之间的切换,比如不同 Layout 之前的过渡,窗体之间的共享元素等,关于 Transitions 的使用场景如下图所示。

android 动效 旋转图标 安卓旋转动画_android 动效 旋转图标_10

6. MotionLayout

MotionLayout 是配合 ConstraintLayout 2.0 一起推出的全新组件,主要用于在各种状态之间的布局设置过渡动画。由于 ConstraintLayout 的出现,使 Android 由之前的多层级树形的 Layout 结构,转向了单层级通过约束来确定位置的 Layout 结构。各个控件之间由约束建立关系,通过修改控件之前的约束,我们就可以实现不同布局之间的过渡动画,这就是 MotionLayout 的由来。

MotionLayout 继承自 ConstraintLayout,所以我们可以在 xml 中直接使用 MotionLayout,同时 MotionLayout 中的动画是完全在 xml 中声明好的,不需要任何代码。

android 动效 旋转图标 安卓旋转动画_让一个动画一直执行的属性是_11

使用 MotionLayout 我们需要在 xml 中自定义 MotionScene,在 MotionScene 中指定不同 Layout 之间的变化。

具体的实现我们可以参考官方 GitHub 仓库:https://github.com/android/views-widgets-samples/tree/master/ConstraintLayoutExamples

总结

1. 如果是复杂布局间的协调动画,以及需要手势来进行动画切换,那么推荐使用 MotionLayout。

android 动效 旋转图标 安卓旋转动画_让一个动画一直执行的属性是_12

2.  如果是建立可中断的动画,同时需要保持平滑的过渡,那么推荐使用 Physics。

android 动效 旋转图标 安卓旋转动画_android 动效 旋转图标_13

3. 如果是用于共享元素和窗口内容转换,推荐使用 Transitions。

android 动效 旋转图标 安卓旋转动画_让一个动画一直执行的属性是_14

4. 如果是作用于 icon 的动画,那么推荐使用 Animated Vector Drawable。

android 动效 旋转图标 安卓旋转动画_android 动效 旋转图标_15

5. 如果是用于 Window animation 那么请使用 Android View Animations。

android 动效 旋转图标 安卓旋转动画_android 动效 旋转图标_16

6. 如果是想要通过修改 View 的使用制作动画,那么请使用 ViewPropertyAnimator。

android 动效 旋转图标 安卓旋转动画_android 动效 旋转图标_17

7. 如果是想要自定义动画,那么就使用 ValueAnimator。

android 动效 旋转图标 安卓旋转动画_android 动效 旋转图标_18

8. 最后一个 ObjectAnimator ,它是一种通用的属性动画解决方案。

android 动效 旋转图标 安卓旋转动画_android 动效 旋转图标_19

好了,平时开发中你常用的动画是哪些呢?可以评论告诉我,如果觉得这篇文章有点意思,记得点个在看?。