J'ai une ImageView qui s'anime lorsqu'elle est ajoutée à une présentation . Quand elle est supprimée, je souhaite inverser la même animation.
Existe-t-il un moyen d'inverser une animation dans Android sans la recoder ni inverser les paramètres?
Non, malheureusement, vous ne pouvez pas le faire avec l'objet Animation . Mais vous pouvez le simuler en utilisant un interpolateur qui inverse l'inverse:
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);
}
}
Ensuite, sur votre animation, vous pouvez définir votre nouvel interpolateur:
myAnimation.setInterpolator(new ReverseInterpolator());
Si vous utilisez Object ou ValueAnimator pour animer la vue, vous pouvez simplement faire
ValueAnimator myAnimator = new ValueAnimator();
myAnimator.reverse()
La documentation peut être trouvée ici .
Basé sur pcans idea, vous pouvez inverser n’importe quel interpolateur, pas seulement linéaire.
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);
J'ai une approche similaire pour les {pcans} mais légèrement différentes. Cela prend une Interpolator
et passera effectivement des valeurs qui seraient les mêmes que si on utilisait passé dans Interpolator
normalement puis en mode REVERSE Vous évite d'avoir à penser aux implémentations boguées de Animation.REVERSE
sur Android. Voir le code ici
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;
}
}
Vous pouvez faire en sorte que le code mémorise la position initiale et la position finale. Et laissez votre code récupérer dynamiquement ces valeurs lors du déclenchement de l'animation.
Si vous utilisez une animation à partir de xml, un moyen simple consiste à créer une animation inverse identique à celle d'origine. Ajoutez Animation.AnimationListener
à l'animation d'origine et dans la méthode onAnimationEnd
démarrez l'animation inversée.
cela a fonctionné pour moi
ObjectAnimator anim = ObjectAnimator.ofFloat(imageViewUpb, "rotation", rotationAngle, rotationAngle + 180);
if (linearLayoutb.getVisibility()==GONE){
linearLayoutb.setVisibility(VISIBLE);
anim.setDuration(500);
anim.start();
rotationAngle += 180;
rotationAngle = rotationAngle%360;
imageViewUpb.animate().rotation(rotationAngle).setDuration(500).start();
}else{
linearLayoutb.setVisibility(GONE);
anim.setDuration(500);
anim.start();
rotationAngle += 180;
rotationAngle = rotationAngle%180;
imageViewUpDownb.animate().rotation(rotationAngle).setDuration(500).start();
}
linearlayoutb est la vue qui se développe lorsque l'imageviewUpb est tournée vers le haut.
faire int rotationAngle = 0; global parameter