Android 设置属性动画AnimatorSet设置pause无效问题
程序员文章站
2022-05-03 08:23:59
...
前言
项目中做广告页动画,要求页面不可见(onpause、onstop)暂停动画执行,于是:
/**
*初始化动画、以及相关动画执行
*/
AnimatorSet set = new AnimatorSet();
set.playTogether(animator, animator1);// 同时执行
set.setDuration(mLoadingTime * 1000);
set.setInterpolator(new LinearInterpolator());
set.start();
set.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
clearAnimation();
if (loadingFinishListener != null) {
loadingFinishListener.finish();
}
}
});
// 判断动画是否执行
if(isPause)set.pause;
else set.resume;
结果发现居然不可以,明明我调用的是官方的API为什么我设置动画暂停却不起作用呢?自己当时老是绕不过来,后来想了很久:
其实AnimatorSet这个动画管理类他内部一个堆栈的实现形式,你每次创建一个动画的时候他都会放入这个队列中,这就导致了,你调用set.pause关闭的并不是上一次执行的动画而是本次的,所以,需要判空,正确用法是:
if (set == null) {
set = new AnimatorSet();
set.playTogether(animator, animator1);// 同时执行
set.setDuration(mLoadingTime * 1000);
set.setInterpolator(new LinearInterpolator());
set.start();
set.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
clearAnimation();
if (loadingFinishListener != null) {
loadingFinishListener.finish();
}
}
});
}
if (!isPuase && set != null) {
set.pause();
} else {
set.resume();
}
}
定义全局的AnimatorSet,使用之前判断AnimatorSet是否存在,不存在的情况下再去创建一个对象,这样就保证了我调用set.pause是我创建的那个动画,才能执行有效。
下一篇: Activity转场动画遇到的问题