web-dev-qa-db-fra.com

Inverser une animation

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?

41
pbreault

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());
72
pcans

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 .

24
thehayro

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);
    }
}

Usage

ReverseInterpolator reverseInterpolator = new ReverseInterpolator(new AccelerateInterpolator())
myAnimation.setInterpolator(reverseInterpolator);
12
Ilya Gazman

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;        
    }
}
6
Dori

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.

1
draw

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.

0
Khurram Shehzad

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

0
Goodlife