2016-06-13 10 views
0

今、回転ファンのアニメーションを作成する必要があります。ユーザーが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アニメータの期間を設定するにはどうすればよいですか?

+0

あなたは、このような無限abimationの使用 '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()); 
       } 
      } 
     }); 
+0

アニメータの継続時間を設定して、加速から直線までの速度に合わせる必要があります。 – legendmohe

関連する問題