今、回転ファンのアニメーションを作成する必要があります。ユーザーがPOWER ONボタンをクリックすると、このファンは回転を開始し、回転速度は一定のレベルに保たれます。ユーザーがPOWER OFFボタンをクリックすると、それが減速して停止します。上記のアニメーションはOKらしいAccelerate - Linearを作成するには - ValueAnimatorを使用してアンドロイドでアニメーション効果を減速させますか?
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アニメータの期間を設定するにはどうすればよいですか?
あなたは、このような無限abimationの使用 'TimeAnimator'たい場合:「このクラスは、システム内の他のすべてのアニメーターと同期しているリスナーに、単純なコールバック機構を提供するいかなる期間はありませんが、補間、あるいは付加価値オブジェクトこれで設定します。 – pskink