У меня есть ImageView, который анимируется, когда он добавляется в макет. Когда он будет удален, я хочу изменить ту же анимацию.
Есть ли способ изменить анимацию в андроиде, не перекодируя ее и изменяя параметры?
У меня есть ImageView, который анимируется, когда он добавляется в макет. Когда он будет удален, я хочу изменить ту же анимацию.
Есть ли способ изменить анимацию в андроиде, не перекодируя ее и изменяя параметры?
Нет, к сожалению, вы не можете сделать это с объектом 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());
Если вы используете Object или ValueAnimator для анимации представления, вы можете просто сделать
ValueAnimator myAnimator = new ValueAnimator();
myAnimator.reverse()
Документацию можно найти здесь.
Основываясь на 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);
У меня аналогичный подход к 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;
}
}
Вы можете заставить код запомнить исходное положение и конечную позицию. И пусть ваш код динамически получает эти значения при запуске анимации.
Если вы используете анимацию из xml, то простой способ - сделать такую же обратную анимацию для оригинальной анимации. Добавьте Animation.AnimationListener
в оригинальную анимацию, а в методе onAnimationEnd
запустите обратную анимацию.