Android 設置屬性動畫AnimatorSet設置pause無效問題

前言

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章