动画总结之 补间动画 —— 渐变效果 初解

补间动画和逐帧动画不同,补间动画只需要指定动画的起始和结束“关键帧”,然后设置好动画持续时间,至于中间的部分,则由系统计算并补齐。

Android 使用 Animation 代表抽象的动画类,它有四个子类:

  • AlphaAnimation:用来实现透明度变化效果的动画
  • ScaleAnimation:用来实现缩放效果的动画
  • TranslateAnimation:用于实现位移效果的动画
  • RotateAnimation:用于实现旋转效果的动画

可以通过 XML 文件设置动画,也可以直接在 Java 代码中设置,推荐在 XML 当中设置,因为这样可以将业务代码和动画区分开,也相对好维护一些。


AlphaAnimation

有两种方法可以创建 AlphaAnimation:

  • Java 代码创建
  • Java 代码 + XML 文件

Java 代码 + XML 文件创建
我们可以在 XML 中描述动画的一些属性,然后再在 Java 代码中实例化该动画对象并设置给组件。

AlphaAnimation 的属性都包含在 <alpha> 元素当中,可用的属性有:

  • android:duration:动画持续的时长,单位是毫秒
  • android:fillAfter:动画结束之后是否保持动画的最终状态;true,表示保持动画的最终状态
  • android:fillBefore:动画结束之后是否保持动画开始前的状态;true,表示恢复到动画开始前的状态
  • android:fromAlpha:动画开始的透明度,取值0.0~1.0,0.0表示完全透明,1.0表示保持原有状态不变
  • android:toAlpha:动画最终的透明度,取值和android:fromAlpha一样
  • android:interpolator:动画插值器。是实现动画不规则运动的一种方式,后面讲到
  • android:repeatCount:动画重复的次数。指定动画重复播放的次数,如果你需要无限循环播放,可设置为 -1
  • android:repeatMode:动画重复的模式,有reverse和restart两种:

例如我们的其实透明度是 1.0,结束透明度为 0.1
当 repeatMode 为 reverse 的时候,动画重复的规则是:从 1.0 过渡到 0.1,再从 0.1 过渡到 1.0,以此重复;
当 repeatMode 为 restart 的时候,动画重复的规则是:从 1.0 过渡到 0.1,直接回到 1.0 并再过渡到 0.1

  • android:startOffset:动画播放延迟时长,就是调用start之后延迟多少时间播放动画

在 Java 代码中,调用 AnimationUtils 对象的 loadAnimation 方法将我们的 XML 文件转换为 AlphaAnimation 对象,然后就可以设置给组件并开始动画了。

anim/anim_alpha.xml

<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="3000"
    android:fromAlpha="1.0"
    android:toAlpha="0.0"
    ></alpha>

MainActivity.java

        imageView = findViewById(R.id.gif);
        AlphaAnimation animation = (AlphaAnimation) new AnimationUtils().loadAnimation(this, R.anim.anim_alpha);
        imageView.startAnimation(animation);

Java 代码创建
可以通过 AlphaAnimation 的构造方法创建出 AlphaAnimation 对象,该方法接收两个参数,分别是动画的起始值和结束值。

然后通过一系列方法设置动画参数:

  • setDuration:设置动画的持续时间
  • setFillAfter:设置动画结束之后的状态是否是动画的最终状态,true,表示是保持动画结束时的最终状态
  • setFillBefore:设置动画结束之后的状态是否是动画开始时的状态,true,表示是保持动画开始时的状态
  • setRepeatMode:设置动画的重复模式:反转REVERSE和重新开始RESTART
  • setRepeatCount:设置动画播放次数
  • setInterpolator:设置插值器
  • setStartOffset:设置动画延时播放的时间

最后调用 View 的 setAnimation 方法将动画对象设置到 View 上,然后再调用动画对象的 start() 或者 startNow() 方法开启动画,也可以直接调用 View 对象的 startAnimation 方法直接启动动画。

需要注意的是,调用 start() 和 startNow 在某些版本上会失效,所以还是建议直接使用 View 对象的 startAnimation 方法启动动画。
可以调用 Animation 对象的 cancel 方法取消动画,调用 View 对象的 clearAnimation 方法也可以取消动画。

public class MainActivity extends Activity {

    private ImageView imageView;
    private Button start, stop;

    private AlphaAnimation animation;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        imageView = findViewById(R.id.gif);
        start = findViewById(R.id.startAnimation);
        stop = findViewById(R.id.stopAnimation);

        animation = new AlphaAnimation(1.0f, 0.0f);//透明度从 1.0 到 0.0
        animation.setDuration(5000);//动画持续事件为5秒
        animation.setStartOffset(2000);//延时2秒执行
        animation.setRepeatCount(-1);//无限重复
    }

    @Override
    protected void onStart() {
        super.onStart();
        start.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                imageView.startAnimation(animation);//启动动画
            }
        });

        stop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                animation.cancel();//取消动画
            }
        });
    }
}

关于 AlphaAnimation 的其他内容,请看: