83 votes

Android: afficher / masquer une vue à l'aide d'une animation

J'ai parcouru de nombreux résultats / questions sur Google ici pour déterminer comment afficher / masquer une vue via une animation verticale, mais je n'arrive pas à en trouver une qui soit exacte ou qui ne soit pas trop vague.

J'ai une mise en page (barre d'annulation) qui se trouve en dessous d'une autre et au-dessus de plusieurs autres widgets; cette barre d'annulation doit glisser verticalement et s'ouvrir, en fonction des circonstances.

Actuellement, tout ce que je fais maintenant, c’est que la vue soit visible ou disparaisse.

S'il vous plaît aider.

67voto

pozuelog Points 151

Définissez l'attribut android:animateLayoutChanges="true" dans la présentation parent.

Si ce n'est pas le cas, placez la vue dans une présentation et définissez android:animateLayoutChanges="true" pour cette présentation.

REMARQUE: cela ne fonctionne qu'à partir de l'API niveau 11+ (Android 3.0).

19voto

Rotemmiz Points 4152

J'ai créé une extension pour RelativeLayout qui montre/cache les Mises en page avec des animations. Elle peut s'étendre à tout type d' View d'accéder à ces fonctionnalités.

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationSet;
import android.view.animation.AnimationUtils;
import android.widget.RelativeLayout;

public class AnimatingRelativeLayout extends RelativeLayout
{
    Context context;
    Animation inAnimation;
    Animation outAnimation;

    public AnimatingRelativeLayout(Context context)
    {
        super(context);
        this.context = context;
        initAnimations();

    }

    public AnimatingRelativeLayout(Context context, AttributeSet attrs)
    {
        super(context, attrs);
        this.context = context;
        initAnimations();
    }

    public AnimatingRelativeLayout(Context context, AttributeSet attrs, int defStyle)
    {
        super(context, attrs, defStyle);
        this.context = context;
        initAnimations();
    }

    private void initAnimations()
    {
        inAnimation = (AnimationSet) AnimationUtils.loadAnimation(context, R.anim.in_animation);
        outAnimation = (Animation) AnimationUtils.loadAnimation(context, R.anim.out_animation);
    }

    public void show()
    {
        if (isVisible()) return;
        show(true);
    }

    public void show(boolean withAnimation)
    {
        if (withAnimation) this.startAnimation(inAnimation);
        this.setVisibility(View.VISIBLE);
    }

    public void hide()
    {
        if (!isVisible()) return;
        hide(true);
    }

    public void hide(boolean withAnimation)
    {
        if (withAnimation) this.startAnimation(outAnimation);
        this.setVisibility(View.GONE);
    }

    public boolean isVisible()
    {
        return (this.getVisibility() == View.VISIBLE);
    }

    public void overrideDefaultInAnimation(Animation inAnimation)
    {
        this.inAnimation = inAnimation;
    }

    public void overrideDefaultOutAnimation(Animation outAnimation)
    {
        this.outAnimation = outAnimation;
    }
}

Vous pouvez remplacer l'original Animations avec overrideDefaultInAnimation et overrideDefaultOutAnimation

Mes Animations originales ont été fadeIn/Out, je suis en ajoutant XML des fichiers d'animation pour Traduire en/de l'écran (à Traduire en haut et de haut)

in_animation.xml:

    <?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="600"
    android:fillAfter="false"
    android:fromXDelta="0"
    android:fromYDelta="-100%p"
    android:toXDelta="0"
    android:toYDelta="0" />

out_animation.xml:

  <?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="600"
    android:fillAfter="false"
    android:fromXDelta="0"
    android:fromYDelta="0"
    android:toXDelta="0"
    android:toYDelta="-100%p" />

15voto

Rudi Points 2888

Cela peut raisonnablement être réalisé dans une déclaration de ligne unique dans API 12 et versions ultérieures. Voici un exemple où v est la vue que vous souhaitez animer;

 v.animate().translationXBy(-1000).start();
 

Cela fera glisser le View en question à gauche de 1000 pixels. Pour remettre la vue sur l'interface utilisateur, nous pouvons simplement procéder comme suit.

 v.animate().translationXBy(1000).start();
 

J'espère que quelqu'un trouvera cela utile.

11voto

Si vous souhaitez uniquement animer la hauteur d'une vue (de 0 à un certain nombre), vous pouvez implémenter votre propre animation:

 final View v = getTheViewToAnimateHere();
Animation anim=new Animation(){
    protected void applyTransformation(float interpolatedTime, Transformation t) {
        super.applyTransformation(interpolatedTime, t);
        // Do relevant calculations here using the interpolatedTime that runs from 0 to 1
        v.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, (int)(30*interpolatedTime)));
    }};
anim.setDuration(500);
v.startAnimation(anim);
 

5voto

andrrs Points 238

Peut-être que vous cherchez un SlidingDrawer .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X