2016-06-13 17 views
0

现在我必须创建一个旋转风扇的动画。当用户点击POWER ON按钮时,这个风扇开始旋转,然后保持它的旋转速度在一定的水平。当用户点击POWER OFF按钮时,它会减速然后停止。如何使用ValueAnimator在android中创建Accelerate - Linear - 减速动画效果?

我做了一些代码如下:

ImageView mFanImageview; 
private ValueAnimator mFanValueAnimator; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_centripetal_particle); 
    ButterKnife.bind(this); 
} 

private void startFan() { 
    mFanValueAnimator = new ValueAnimator(); 
    mFanValueAnimator.setDuration(1000); 
    mFanValueAnimator.setFloatValues(mFanImageview.getRotation(), mFanImageview.getRotation() + 360); 
    mFanValueAnimator.setInterpolator(new AccelerateInterpolator()); 
    mFanValueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
     @Override 
     public void onAnimationUpdate(ValueAnimator animation) { 
      mFanImageview.setRotation((Float) animation.getAnimatedValue()); 
     } 
    }); 
    mFanValueAnimator.addListener(new AnimatorListenerAdapter() { 
     @Override 
     public void onAnimationEnd(Animator animation) { 
      mFanValueAnimator = new ValueAnimator(); 
      mFanValueAnimator.setDuration(500); 
      mFanValueAnimator.setFloatValues(mFanImageview.getRotation(), mFanImageview.getRotation() + 360); 
      mFanValueAnimator.setRepeatCount(ValueAnimator.INFINITE); 
      mFanValueAnimator.setRepeatMode(ValueAnimator.RESTART); 
      mFanValueAnimator.setInterpolator(new LinearInterpolator()); 
      mFanValueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
       @Override 
       public void onAnimationUpdate(ValueAnimator animation) { 
        mFanImageview.setRotation((Float) animation.getAnimatedValue()); 
       } 
      }); 
      mFanValueAnimator.addListener(new AnimatorListenerAdapter() { 
       @Override 
       public void onAnimationCancel(Animator animation) { 
        stopFanValueAnimator().start(); 
       } 
      }); 
      mFanValueAnimator.start(); 
     } 

     @Override 
     public void onAnimationCancel(Animator animation) { 
      stopFanValueAnimator().start(); 
     } 
    }); 
    mFanValueAnimator.start(); 
} 

private ValueAnimator stopFanValueAnimator() { 
    ValueAnimator stopAnimator = new ValueAnimator(); 
    stopAnimator.setDuration(1000); 
    stopAnimator.setFloatValues(mFanImageview.getRotation(), mFanImageview.getRotation() + 360); 
    stopAnimator.setInterpolator(new DecelerateInterpolator()); 
    stopAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
     @Override 
     public void onAnimationUpdate(ValueAnimator animation) { 
      mFanImageview.setRotation((Float) animation.getAnimatedValue()); 
     } 
    }); 
    return stopAnimator; 
} 

@OnClick(R.id.stop_button) 
public void onStopButtonClicked() { 
    mFanValueAnimator.cancel(); 
} 

@OnClick(R.id.start_button) 
public void onStartButtonClicked() { 
    startFan(); 
} 

上面的动画似乎确定,但我发现,在AccelerateInterpolator动画结束时的风扇旋转速度是难以企及的LinearInterpolator.I年初有仔细调整LinearInterpolator动画师的持续时间。

如何在AccelerateInterpolator动画制作者结束时获取更新率,然后设置LinearInterpolator动画制作者的合适持续时间?

+0

'TimeAnimator':“这个类提供了一个简单的回调机制到与系统中的所有其他动画同步的听众有没有时间,插值,或对象值 - 。使用此设置“ – pskink

回答

0

我认为最好的办法是先设置加速插补器,再重新设置LinearInterpolator。现在在重复的情况下放置一个标志来处理关闭。如果要求关闭,则更改将应用​​减速插补器的开关关标志的值,并确保动画不会再次运行。

mFanValueAnimator.addListener(new AnimatorListenerAdapter() { 
      @Override 
      public void onAnimationRepeat(Animator animation) { 
       if (switchOff) { 
        animation.setInterpolator(new DecelerateInterpolator()); 
       } else { 
        animation.setInterpolator(new LinearInterpolator()); 
       } 
      } 
     }); 
如果你想这样一个无限abimation使用
+0

它仍然需要设置动画制作者的持续时间以匹配从加速到线性的速度。 – legendmohe

相关问题