Android动画

Android 中动画划分为两大类 视图动画(View Animation)和 属性动画(Property Animation)。其中 属性动画(Property Animation)需要在 Android3.0 之后(API >= 11)使用。
视图动画(View Animation)又包括了 帧动画(Frame Animation) 和 补间动画(Tweened Animation)。

视图动画(View Animation)

帧动画(Frame Animation)

帧动画(Frame Animation) 有时也叫 Drawable 动画,这种动画的实质其实是 Drawable。像播放幻灯片一样,利用视觉残留产生动画效果。

核心类:AnimationDrawable

使用方式:

XML 定义帧动画

推荐使用 XML 定义动画:

在 res/drawable 下新建 animation_frame_test.xml

1
2
3
4
5
6
7
8
9
10
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false">
<item
android:drawable="@color/colorPrimary"
android:duration="300" />
<item
android:drawable="@color/colorPrimaryDark"
android:duration="300" />
</animation-list>

Java 代码创建帧动画

创建 AnimationDrawable 对象,addFrame(Drawable frame,int duration)向动画中添加帧,调用 start()和 stop()。

补间动画(Tweened Animation)

补间动画(Tweened Animation)只能应用于 View 对象,而且只支持一部分属性,它只是改变了 View 对象绘制的位置,而没有改变 View 对象本身(所以点击响应区域还在原来的位置)。多用于 Window 切换动画或 Activity 跳转动画。

核心类:android.view.animation.Animator

补间动画可以分为四种形式,分别是 alpha(淡入淡出),translate(位移),scale(缩放大小),rotate(旋转)。

java 类

  • AlphaAnimation 渐变透明度动画效果
  • RotateAnimation 画面转移旋转动画效果
  • ScaleAnimation 渐变尺寸伸缩动画效果
  • TranslateAnimation 画面转换位置移动动画效果
  • AnimationSet 一个持有其它动画元素 alpha、scale、translate、rotate 或者其它 set 元素的容器

插值器:

  • LinearInterpolator:动画以均匀的速度改变
  • AccelerateInterpolator:在动画开始的地方改变速度较慢,然后开始加速
  • AccelerateDecelerateInterpolator:在动画开始、结束的地方改变速度较慢,中间时加速
  • CycleInterpolator:动画循环播放特定次数,变化速度按正弦曲线改变: Math.sin(2 mCycles Math.PI * input)
  • DecelerateInterpolator:在动画开始的地方改变速度较快,然后开始减速
  • AnticipateInterpolator:反向,先向相反方向改变一段再加速播放
  • AnticipateOvershootInterpolator:开始的时候向后然后向前甩一定值后返回最后的值
  • BounceInterpolator: 跳跃,快到目的值时值会跳跃,如目的值 100,后面的值可能依次为 85,77,70,80,90,100
  • OvershottInterpolator:回弹,最后超出目的值然后缓慢改变到目的值

XML

在 res/anim 下新建 animation_tweened_test_rotate.xml

1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="1000"
android:fromDegrees="0"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:pivotX="50%"
android:pivotY="50%"
android:repeatCount="infinite"
android:toDegrees="360" />

AnimationUtils.loadAnimation(Context context, @AnimRes int id)创建 Animation,然后给指定的 View 调用 view.startAnimation(Animation animation) view.clearAnimation()

属性动画(Property Animation)

属性动画实现原理就是修改控件的属性值实现的动画。

核心类:android.animation.Animator

  • Animator 创建属性动画的基类
  • ValueAnimator Animator 子类。其内部采用一种时间循环的机制来计算值与值之间的动画过度,我们只需将初始值以及结束值提供给该类,并告诉其动画所需时间长度,该类就会自动帮我们从初始值平滑过度到结束。该类还能管理动画的播放次数、模式和监听器等。
  • ObjectAnimator ValueAnimator 的子类,允许我们对指定对象的属性执行动画,用起来更简单,实际中用得较多。
  • AnimatorSet Animator 子类,可以组合多个 Animator,并制定 Animator 的播放次序。
  • Interpolator 插值器,同补间动画。
  • Evaluator 计算器,告诉动画系统如何从初始值过度到结束值。提供了一下的几种 Evaluator:

IntEvaluator:用于计算 int 属性
FloatEvaluator:用于计算 float 属性
ArgbEvaluator:用于计算 16 进制表示颜色值的计算器
TypeEvaluator:上述计算类的公共接口,可以自己实现接口完成自定义

监听器:

AnimatorUpdateListener: 当值状态发生改变时候会回调 onAnimationUpdate 方法。

AnimatorListener、AnimatorListenerAdapter:

  • onAnimationStart():动画开始
  • onAnimationRepeat():动画重复执行
  • onAnimationEnd():动画结束
  • onAnimationCancel():动画取消

平常开发,属性动画多使用 ValueAnimator 和 ObjectAnimator。
ValueAnimator 有个缺点,就是只能对数值对动画计算。
为了能让动画直接与对应控件相关联,以使我们从监听动画过程中解放出来,可以使用 ValueAnimator 的子类 ObjectAnimator。

使用 ObjectAnimator 实现动画也有一些要求和限制:

  1. 动画显示的属性必须带有一个 setter 方法(以骆驼拼写法命名)。 因为 ObjectAnimator 会在动画期间自动更新属性值,它必须能够用此 setter 方法访问到该属性。 例如:假设属性名称为 color,则需要有一个 setColor()方法。
  2. 如果在调用 ObjectAnimator 的某个工厂方法时,我们只为 values… 参数指定了一个值,那此值将被认定为动画属性的结束值。 这样的话,动画显示的属性必须带有一个 getter 方法,用于获取动画的起始值。例如:假设属性名为 color,则需要有一个 getColor()方法。
  3. 动画属性的 getter 方法(如果必要的话)和 setter 方法所操作数据的类型必须与 ObjectAnimator 中设定的起始和结束值相同。

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!