Подтвердить что ты не робот

Реверсирование анимации

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

Есть ли способ изменить анимацию в андроиде, не перекодируя ее и изменяя параметры?

4b9b3361

Ответ 1

Нет, к сожалению, вы не можете сделать это с объектом Animation. Но вы можете имитировать его с помощью интерполятора, который будет инвертировать анимацию:

package com.example.android;

import android.view.animation.Interpolator;

public class ReverseInterpolator implements Interpolator {
    @Override
    public float getInterpolation(float paramFloat) {
        return Math.abs(paramFloat -1f);
    }
}

Затем в анимации вы можете установить новый интерполятор:

myAnimation.setInterpolator(new ReverseInterpolator());

Ответ 2

Если вы используете Object или ValueAnimator для анимации представления, вы можете просто сделать

ValueAnimator myAnimator = new ValueAnimator();  
myAnimator.reverse()

Документацию можно найти здесь.

Ответ 3

Основываясь на pcans, вы можете отменить любой интерполятор, а не только линейный.

class ReverseInterpolator implements Interpolator{
    private final Interpolator delegate;

    public ReverseInterpolator(Interpolator delegate){
        this.delegate = delegate;
    }

    public ReverseInterpolator(){
        this(new LinearInterpolator());
    }

    @Override
    public float getInterpolation(float input) {
        return 1 - delegate.getInterpolation(input);
    }
}

Использование

ReverseInterpolator reverseInterpolator = new ReverseInterpolator(new AccelerateInterpolator())
myAnimation.setInterpolator(reverseInterpolator);

Ответ 4

У меня аналогичный подход к pcans, но немного отличается. Он принимает Interpolator и будет эффективно передавать значения, которые будут такими же, как при использовании переданного в Interpolator, а затем в режиме REVERSE. Сохраняет необходимость думать о ошибках реализации Animation.REVERSE для Android. См. Код здесь

public class ReverseInterpolator implements Interpolator {

    private final Interpolator mInterpolator;

    public ReverseInterpolator(Interpolator interpolator){
        mInterpolator = interpolator;
    }

    @Override
    public float getInterpolation(float input) {
        return mInterpolator.getInterpolation(reverseInput(input));
    }

    /**
     * Map value so 0-0.5 = 0-1 and 0.5-1 = 1-0
     */
    private float reverseInput(float input){        
        if(input <= 0.5)
            return input*2;
        else
            return Math.abs(input-1)*2;        
    }
}

Ответ 5

Вы можете заставить код запомнить исходное положение и конечную позицию. И пусть ваш код динамически получает эти значения при запуске анимации.

Ответ 6

Если вы используете анимацию из xml, то простой способ - сделать такую ​​же обратную анимацию для оригинальной анимации. Добавьте Animation.AnimationListener в оригинальную анимацию, а в методе onAnimationEnd запустите обратную анимацию.