0

Как ясно сказано, я хочу замедлить работу TranslateAnimation, пока он выполняется, когда пользователь нажимает на определенную кнопку.Как замедлить анимацию в середине во время ее выполнения?

Это, как я экземпляр TranslateAnim где -textViewHeight и layoutHeight лишь некоторые значения я уже воплощенные в более раннее время:

Это идет от до дна.

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

Он по-прежнему работает. Имейте функцию на интерполяторе, которая сообщает ему перейти в медленный режим. Вызовите его, когда нажимается кнопка. Вам придется немного поиграть с ним, но правильным ответом будет Интерполятор. –

+0

Ahh, я понял, что вы знаете. Я постараюсь сделать это, тогда я отвечу вам. –