前言
項目中做廣告頁動畫,要求頁面不可見(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是我創建的那個動畫,才能執行有效。