解决ValueAnimator.pause()与resume()向下不兼容

在项目开发时,为了实现比较有趣的一些动画效果,往往会用到属性动画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以下的兼容问题了。

你可能感兴趣的:(零点笔记)