2015-02-07 100 views
4

我有下面的代碼(在斯卡拉Android項目):我可以重複使用ValueAnimator嗎?

val animator = new ValueAnimator 
animator.setFloatValues(0f, 100f) 
animator.setDuration(20000L) 
animator.addUpdateListener(this) // prints current value to console 
animator.start 

override def onTouch(v: View, event: MotionEvent) = { 
    animator.setFloatValues(100f, 0f) 
    animator.setCurrentPlayTime(0) 

    if (!animator.isRunning) animator.start 
    true 
} 

如果我觸摸屏幕,同時animator運行那麼它是否正確啓動向後工作(因爲我已經換了值)。但是如果我在屏幕完成後觸摸屏幕,則什麼都不會發生,它不會重新開始。

問題是我可以以某種方式重用這個動畫製作器,並且在它停止後給它賦值嗎?

+1

你就是不行。我剛剛檢查過它。我也想在應用程序中重用它。所以使用clone來獲得一個新的實例,然後爲每個實例設置目標視圖。 – Napolean 2015-06-18 08:03:56

回答

0

您無法重複使用動畫。

你需要復位(),並通過調用再次使用同一個對象之前,初始化()方法重新初始化動畫對象。這與實例化新的動畫對象相似。

+0

ValueAnimator是動畫師,而不是動畫。 – 2017-02-06 14:08:22

2

您可以通過以下方式重複使用動畫:

... 
animator.end(); 
animator.setFloatValues(...); 
animator.start(); 
... 

您還可以使用animator.cancel()代替animator.end()並通過最後一個值從去年的動畫新動畫作爲起始浮動。例如,如果上一個動畫值爲50,則可以撥打animator.setFloatValues(50, 0f),以便您的動畫看起來連接起來。

考慮到接受的答案表明這是不可能的,我想提到的是,當用戶用兩個手指點擊時,所描述的方法在Touch Circle應用中使用。順便說一句,這是一個非常不錯的效果,當物體顫抖一點點 - 用它如你所願,代碼exerpt低於:

void shapeTremble(long delay) { 
    if (null == animatorTremble) { 
     ValueAnimator animator = new ValueAnimator(); 
     animator.setDuration(850).setInterpolator(new AccelerateDecelerateInterpolator()); 
     animator.addUpdateListener(new AnimatorUpdateListener() { 
      @Override 
      public void onAnimationUpdate(ValueAnimator valueAnimator) { 
       setCircleScale((Float) valueAnimator.getAnimatedValue(), true); 
      } 
     }); 
     animatorTremble = animator; 
    } else { 
     animatorTremble.cancel(); 
    } 
    animatorTremble.setFloatValues(circleScale, 0.85f, 1.05f, 0.95f, 1.025f, 1.0f); 
    animatorTremble.setStartDelay(delay); 
    animatorTremble.start(); 
} 
相關問題