0

由於問題已清楚說明,我想在用戶點擊某個按鈕時執行TranslateAnimation時放慢速度。如何在執行過程中減慢中間的動畫?

我這是怎麼實例化TranslateAnim其中-textViewHeightlayoutHeight都只是一些價值觀,我已經在較早的時間實例:

它從多達底部。

TranslateAnim translateAnim = new TranslateAnim(0, 0, -textViewHeight, layoutHeight); 
translateAnim.setDuration(20000); 
translateAnim.setInterpolator(new LinearInterpolator()); 
textView.startAnimation(translateAnim); 

這就是我想要減緩TranslateAnim下來的方法:

如我所料,雖然它沒有工作。

public void slowDown() { 
    translateAnim.setStartTime(translateAnim.getStartTime() - 20000); 
    translateAnim.setDuration((20000 - translateAnim.getElapsedTime()) * 2); 
} 

我也試過這樣做,但仍沒有運氣:

translateAnim.setInterpolator(new DecelerateInterpolator()); 

我定製TranslateAnim類擴展TranslateAnimation:

public class TranslateAnim extends TranslateAnimation { 

    private long mElapsedAtPause, elapsedTime; 
    private boolean mPaused = false; 

    public TranslateAnim(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta) { 
     super(fromXDelta, toXDelta, fromYDelta, toYDelta); 
    } 

    @Override 
    public boolean getTransformation(long currentTime, Transformation outTransformation) { 
     if (mPaused && mElapsedAtPause == 0) { 
      mElapsedAtPause = currentTime - getStartTime(); 
     } 
     if (mPaused) { 
      setStartTime(currentTime - mElapsedAtPause); 
     } 
     elapsedTime = currentTime - getStartTime(); 
     return super.getTransformation(currentTime, outTransformation); 
    } 

    public long getElapsedTime() { 
     return elapsedTime; 
    } 

    public void slowDown() { 
     translateAnim.setStartTime(translateAnim.getStartTime() - 20000); 
     translateAnim.setDuration((20000 - translateAnim.getElapsedTime()) * 2); 
    } 

    public void pause() { 
     mElapsedAtPause = 0; 
     mPaused = true; 
    } 

    public void resume() { 
     mPaused = false; 
    } 

    @Override 
    public void cancel() { 
     super.cancel(); 
     elapsedTime = 0; 
     mElapsedAtPause = 0; 
     mPaused = false; 
    } 
} 

對此有什麼解決辦法?

回答

1

使用定製插補器而不是線性插補器。線性的會導致它具有相同的時間片。自定義的可以讓中間的時間片更長。

例如:

public class CustomInterpolator implements Interpolator { 

    public boolean slowMode; 
    float lastInput; 
    float lastInputBeforeSlowed; 

    @Override 
    public float getInterpolation(float input) { 
     if (!slowMode) { 
      //Should be edited 
      lastInput = input; 
      return input; 
     } else { 
      return (input - lastInputBeforeSlowed) * .5f + lastInputBeforeSlowed; 
     } 
    } 

    public void enterSlowMode() { 
     slowMode = true; 
     lastInputBeforeSlowed = lastInput; 
    } 

    public void endSlowMode() { 
     slowMode = false; 
     //Should be edited 
    } 
} 
+0

我已經知道了,但我的問題的目的是爲了做到這一點,而這是在動畫中被執行。所以不幸的是這不會起作用。 –

+0

它仍然有效。在插補器上有一個函數可以讓它進入慢速模式。點擊按鈕時調用它。你必須稍微玩一下,但正確的答案是Interpolator。 –

+0

啊,我明白你知道。我會盡力去做,然後我會回覆你。 –