2012-08-16 53 views
2

嗨我使用AnimatorSet和ValueAnimator將多個動畫應用於視圖。Android多動畫設置重置

當用戶觸摸視圖時,連續動畫將應用於視圖。當用戶在視圖上移動他的手指時,我會這樣做以獲得「縮放效果」。

該視圖是一個自定義畫廊。

這裏是動畫代碼:我有一個onTouchListener和行動的舉動我先後調用此方法增加或減少mScaleFactor

private void createAnim(final View v) { 
    animating = true; 
    if (D) 
     Log.i(TAG, "sarting animation"); 
    try { 
     v.clearAnimation(); 
     v.getAnimation().reset(); 
    } catch (Exception e) { 

    } 

    set = new AnimatorSet(); 

    set.addListener(new AnimatorListener() { 

     @Override 
     public void onAnimationStart(Animator animation) { 


     } 

     @Override 
     public void onAnimationRepeat(Animator animation) { 

     } 

     @Override 
     public void onAnimationEnd(Animator animation) { 
      if (D) 
       Log.i(TAG, "Animation ended"); 
      animating = false; 
     } 

     @Override 
     public void onAnimationCancel(Animator animation) { 
      animating = false; 
      if (D) 
       Log.i(TAG, "Animation cancelled"); 

     } 
    });  

    set.setDuration(100); 

    ValueAnimator v1 = ObjectAnimator.ofFloat(v, "scaleX", mScaleFactor); 
    ValueAnimator v2 = ObjectAnimator.ofFloat(v, "scaleY", mScaleFactor); 

    animationList.add(v1); 
    animationList.add(v2); 
    set.playTogether(v1, v2); 

set.start() 
} 

當用戶釋放手指時,我希望視圖回到之前的狀態,我的意思是清除應用的所有動畫,就好像它們從未應用於視圖一樣。問題是你可以很容易地做到這一點,但對於許多人來說,我無法找到正確的方式。這是我曾嘗試過的:

- 將動畫添加到ArrayList中,並對它們中的每一個執行animation.reverse(),並將延遲+100添加到它們中的每一個,以便一個接一個執行,但結束結果與動畫之前看起來不完全一樣。

v.clearAnimation();只取消最後的動畫 v.getAnimation()。reset();相同只適用於最後/活動動畫。 有沒有一種方法可以像在任何動畫開始之前那樣獲取視圖? 非常感謝

回答

5

由於沒有「反向」方法,反轉AnimatorSet的效果可能會非常棘手。在這種情況下,最簡單的方法可能只是另一個AnimatorSet,它與原來的方法相反。這裏的問題是您的AnimatorListener可能不同步。如果你這樣做,你想保持布爾值,那麼你必須將它實現爲某種信號量。

public static class AnimatorTracker implements AnimatorListener{ 
    int counter; 

    public AnimatorTracker() { 
     counter = 0; 
    } 

    public boolean isAnimating() { 
     return counter == 0; 
    } 

    @Override 
    public void onAnimationStart(Animator animation) { 
     counter++; 
    } 

    @Override 
    public void onAnimationRepeat(Animator animation) { 
    } 

    @Override 
    public void onAnimationEnd(Animator animation) { 
     counter--; 
    } 

    @Override 
    public void onAnimationCancel(Animator animation) { 
     // Canceling an animation invokes onAnimationEnd, so nothing needs to be done. 
    } 
    } 

然後,只需讓你集只是做同樣的方式:

AnimatorTracker tracker = new AnimatorTracker(); // or make it a global reference 
AnimatorSet set = new AnimatorSet(); 
AnimatorSet reverseSet = new AnimatorSet(); 

ValueAnimator v1 = ObjectAnimator.ofFloat(v, "scaleX", mScaleFactor); 
ValueAnimator v2 = ObjectAnimator.ofFloat(v, "scaleY", mScaleFactor); 
ValueAnimator reverseV1 = ObjectAnimator.ofFloat(v, "scaleX", 1.0f); 
ValueAnimator reverseV2 = ObjectAnimator.ofFloat(v, "scaleY", 1.0f); 


set.addListener(tracker); 
set.setDuration(100); 
set.playTogether(v1, v2); 

reverseSet.addListener(tracker); 
reverseSet.setDuration(100); 
reverseSet.playTogether(reverseV1, reverseV2); 

呼叫set.start()時要動畫前進。當您想要回放動畫時請致電reverseSet.start()

+0

謝謝男人!!!完美的作品! – vallllll 2012-08-16 14:32:53