解决ValueAnimator.pause()与resume()向下不兼容
2017-12-05 10:32
477 查看
在项目开发时,为了实现比较有趣的一些动画效果,往往会用到属性动画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(![b]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以下的兼容问题了。
相关文章推荐
- IE9+已经不对document.createElement向下兼容的解决方法
- Win7向下兼容性问题的一种解决方法
- 当我们向下兼容2.2系统的时候出现'Theme.Base.AppCompat.Dialog.FixedSize'错误的解决办法
- IE9+已经不对document.createElement向下兼容的解决方法
- 解决Fragment向下兼容问题
- Win7向下兼容性问题的一种解决方法
- null value was assigned to a property of primitive type setter of原因急解决方法
- iOS8 数字键盘添加自定义按钮(兼容各个版本以及解决自定义按钮滑动出现的问题)
- 解决MySQL里的ERROR 1366 (HY000): Incorrect string value
- javascript 常用兼容fire fox的解决办法
- java EE5与javamail不兼容的解决办法
- Mysql错误1366 - Incorrect integer value解决方法
- “基类包括字段,但其类型与控件的类型不兼容”的解决方法
- 解决浏览器之间的兼容问题
- expression解决IE6下固定定位的兼容
- assigned , native , identity 区别-Field 'id' doesn't have a default value问题解决方法
- 【问题解决】MySQL5.5 向MySQL数据库中插入汉字时,提示:Incorrect string value: '\Xe7\x8E...' for column 'XXX' at row 1
- 解决Activity启动黑屏及设置android:windowIsTranslucent不兼容activity切换动画问题
- 王学岗属性动画上(四)------ValueAnimator的应用
- 聊聊怎么在32位系统上装64位系统,解决32位安装64位系统不兼容问题