之前只是简单的讲了讲Android动画当方面一些基础、定义之类的,今天讲一讲一些比较具体的应用场景。主要是动画的监听,对动画的监听和其他事件的监听一样,都是使用添加Listener的形式,利用listener进行监听,一般主要使用的监听有两个,Animator.AnimatorListener和AnimatorListenerAdapter,两者的差别在于使用的时候AnimatorListenerAdapter可以直接实现一种监听事件就使用(onAnimationStart (动画开始),onAnimationEnd (动画结束),onAnimationCancel (动画取消),onAnimationRepeat (动画重复)),适合用于只需要监听动画事件中的一种时使用,比较方便快捷。例如,以下是对动画animatorSet进行动画开始的监听,
animatorSet.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationStart(Animator animation) {
super.onAnimationStart(animation);
}
});
而使用Animator.AnimatorListener需要实现以上四种事件的全部事件(即使是空实现也行),适合用于需要监听多种事件的场景。例如,是对动画animatorSet进行动画的监听
animatorSet.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
在平时工作时大多数人习惯使用后面的方式,以便为后来的人预留好位置(个人看法)。
需要注意的是,由于动画的执行需要时间,但是在动画执行的这段时间内,通常会允许人们进行其他的操作,其中可能包括会需要我们将原本正在执行的动画取消的操作,所以这个时候我们需要手动的取消原本还在执行的动画。例如,以下是对一个缩放动画的监听(动画此处省略)
mScaleAnim.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
Log.d("Animdeom", "onAnimationStart: ");
}
@Override
public void onAnimationEnd(Animator animation) {
Log.d("Animdeom", "onAnimationEnd: ");
}
@Override
public void onAnimationCancel(Animator animation) {
Log.d("Animdeom", "onAnimationCancel: ");
}
@Override
public void onAnimationRepeat(Animator animation) {
Log.d("Animdeom", "onAnimationRepeat: ");
}
});
mScaleAnim.start();
这里需要注意的是,一定要先给动画添加监听再开启动画,不然可能会有动画的某些事件没有监听到的现象。如图所示,该动画的开始、结束、取消、重复状态都会打印相应的状态。
如上图所示,正常的情况下动画正常执行完只有开始(start)和结束(end)两个状态会被监听到。当我们需要取消动画时,调用的是动画的cancel()方法,调用cancel()方法的时候首先会执行坚挺的onAnimatorCancel(),这个时候同样需要注意的是,触发完了动画的cancel()方法后,依旧会触发动画的onAnimtorEnd()监听,cancel()只是把动画直接调整到动画的最后一帧而已,然后调用动画的onAnimtorEnd()监听。
如上图所示,该情况是动画开始后调用动画的cancel()方法后动画的执行流程。除了以上的监听,动画还有pause的监听,这里九九暂不介绍了。