您的位置:首页 > 产品设计 > UI/UE

解决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以下的兼容问题了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: