在日常的Android开发中,我们可能经常会使用到动画,但是Android有哪些动画,它们有什么区别,我们也需要去了解。下面就对Android中常用的动画做一下总结。

前面一篇文章已经总结了传统动画,如果需要了解,可以点击下面链接。
Android 动画(一)Animation

或者想了解下插值器和估值器,可以点击下面链接。
Android 动画(二)Animator

插值器(Interpolator)

简介

作用:设置 属性值 从初始值过渡到结束值 的变化规律;如动画效果变化的模式,如匀速变化、加速变化 等等。

使用方法
  • 在XML代码中设置插值器属性android:interpolator

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?xml version="1.0" encoding="utf-8"?>
    <scale xmlns:android="http://schemas.android.com/apk/res/android"
    // 通过资源ID设置插值器
    android:interpolator="@android:anim/overshoot_interpolator"
    android:duration="3000"
    android:fromXScale="0.0"
    android:fromYScale="0.0"
    android:pivotX="50%"
    android:pivotY="50%"
    android:toXScale="2"
    android:toYScale="2" />
  • 通过java代码设置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // 步骤1:创建 需要设置动画的 视图View
    Button mButton = (Button) findViewById(R.id.Button);
    // 步骤2:创建透明度动画的对象 & 设置动画效果
    Animation alphaAnimation = new AlphaAnimation(1,0);
    alphaAnimation.setDuration(3000);
    // 步骤3:创建对应的插值器类对象
    Interpolator overshootInterpolator = new OvershootInterpolator();
    // 步骤4:给动画设置插值器
    alphaAnimation.setInterpolator(overshootInterpolator);
    // 步骤5:播放动画
    mButton.startAnimation(alphaAnimation);
自定义插值器
  • 本质:根据动画的进度(0%-100%)计算出当前属性值改变的百分比
  • 具体使用:自定义插值器需要实现 Interpolator / TimeInterpolator接口 & 复写getInterpolation()

系统提供相关插值器的插值器的理解:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 匀速 LinearInterpolator
@HasNativeInterpolator
public class LinearInterpolator extends BaseInterpolator implements NativeInterpolatorFactory{
public float getInterpolation(float input) {
return input;
// 没有对input值进行任何逻辑处理,直接返回
// 即input值 = fraction值
// 因为input值是匀速增加的,因此fraction值也是匀速增加的.
// 所以动画的运动情况也是匀速的,所以是匀速插值器
}
}

// 先加速再减速 AccelerateDecelerateInterpolator
@HasNativeInterpolator
public class AccelerateDecelerateInterpolator implements Interpolator,NativeInterpolatorFactory{
public float getInterpolation(float input) {
return (float)(Math.cos((input + 1) * Math.PI) / 2.0f) + 0.5f;
// 使用了余弦函数,因input的取值范围是0到1,那么cos函数中的取值范围就是π到2π。
// 而cos(π)的结果是-1,cos(2π)的结果是1
// 所以该值除以2加上0.5后,getInterpolation()方法最终返回的结果值还是在0到1之间。
// 只不过经过了余弦运算之后,最终的结果不再是匀速增加的了,而是经历了一个先加速后减速的过程.
}
}

估值器(TypeEvaluator)

简介

作用:设置 属性值 从初始值过渡到结束值 的变化具体数值

使用方法
1
2
// 在第3个参数中传入对应估值器类的对象
ObjectAnimator anim = ObjectAnimator.ofObject(myView2, "height", new Evaluator(),1,3);

系统内置的估值器有3个:
IntEvaluator:以整型的形式从初始值 - 结束值 进行过渡
FloatEvaluator:以浮点型的形式从初始值 - 结束值 进行过渡
ArgbEvaluator:以Argb类型的形式从初始值 - 结束值 进行过渡

自定义估值器

自定义估值器需要实现 TypeEvaluator接口 & 复写evaluate()

看一个已经实现好的系统内置的浮点型插值器:FloatEvaluator

1
2
3
4
5
6
7
8
9
10
public class FloatEvaluator implements TypeEvaluator {  
// FloatEvaluator实现了TypeEvaluator接口
// 重写evaluate()
public Object evaluate(float fraction, Object startValue, Object endValue) {
// fraction:表示动画完成度(根据它来计算当前动画的值)
// startValue、endValue:动画的初始值和结束值
float startFloat = ((Number) startValue).floatValue();
return startFloat + fraction * (((Number) endValue).floatValue() - startFloat);
}
}

初始值 过渡 到结束值 的算法是:

  1. 用结束值减去初始值,算出它们之间的差值
  2. 用上述差值乘以fraction系数
  3. 再加上初始值,就得到当前动画的值