在项目开发时,为了实现比较有趣的一些动画效果,往往会用到属性动画ValueAnimator,但是其中方法resume()和pause()只支持SDK19以上,遇到这种情况通过修改Manifest确实能使错误提示消失,但根本问题并没有解决。除非你针对的机型铁定不包含低版本的安卓机。
android:minSdkVersion="19" 这种方式有些取巧,解决不了问题
那么如何在SDK19以下的实现与resume()和pause()等价的效果呢?一般情况下用start()和cancel()就可以了(这不废话吗?),但在某个时间点,或是某个值animation.getAnimateValue()暂停后,在特点条件下恢复就不能单纯地直接cancel()和start()了。我们知道,利用ValueAnimator,往往伴生一个AnimatorUpdateListener和一个 AnimatorListener,在pause()被调用的时候,AnimatorUpdateListener内部的AnimatedValue也停止了变化,这是一个关键点,因为可以利用他得到动画运行距离结束还剩多少时间(如果你需要的话)。下面代码中我用progress记录了其变化。
ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { progress = (float) animation.getAnimatedValue(); //实现你要的动画效果} } };valueAnimator = ValueAnimator.ofFloat(0, 1).setDuration(duration); valueAnimator.setInterpolator(new AccelerateDecelerateInterpolator()); valueAnimator.setRepeatCount(Animation.INFINITE); valueAnimator.setRepeatMode(ValueAnimator.REVERSE);这里我将动画设置为可反向运行的,下面的一些设置也是由这个而来。
定义一个布尔值变量isAnimatorPause = false;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { valueAnimator.pause(); } else { if (!isAnimatorPause){ valueAnimator.cancel();isAnimatorPause = true;}}暂停处做以上修改=================================分割线=========================================
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { valueAnimator.resume(); } else {//为minSDK 19以下做兼容 valueAnimator.setFloatValues(progress, 1); valueAnimator.setDuration(500); valueAnimator.setRepeatCount(0); valueAnimator.start(); }恢复动画的点做以上变动最初的设置里面是从0变化到1的,并且是重复播放的,但为了实现从暂停到继续的效果,这里要把0改为暂停时progress的值,repeatCount也要改为0.当然,如果你喜欢并且确定他什么时候暂停,你完全可以分成两个动画来。
我这里因为这有在第一次开启动画时才会有一个暂停效果,感觉这样写要好些。
new Animator.AnimatorListener() { @Override public void onAnimationEnd(Animator animation) { if(isAnimatorPause){ isAnimatorPause = false; valueAnimator.setFloatValues(1, 0); valueAnimator.setDuration(duration);isLeftTurn = !isLeftTurn;valueAnimator.setRepeatCount(Animation.INFINITE); valueAnimator.start(); } }...........................}
做完这几步就可以实现属性动画暂停和恢复方法的效果在SDK19以下的兼容问题了。