欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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是我创建的那个动画,才能执行有效。

相关标签: big AnimatorSet