2016-06-13 28 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

相關問題