web-dev-qa-db-fra.com

Animer la visibilité d'une vue passée à visible avec animation

J'ai une vue qui est invisible par défaut (juste pour la première fois).

Maintenant, je dois passer la visibilité à VISIBLE avec ceci animation:

if (myView.getVisibility() == View.INVISIBLE) {
    myView.setVisibility(View.VISIBLE);
    myView.animate().translationY(0);
 }

(Comme l'animation par défaut SnackBar)

Mais ça ne marche pas. Il deviendra visible avec l'animation par défaut

Existe-t-il un moyen simple de réaliser cela?

Note

J'anime mon point de vue pour écarter, comme ceci:

myView.animate().translationY(myView.getHeight());
16
DastakWall

Vous pouvez le faire en utilisant XML animation.

Créez une animation slide-upXML en utilisant set et alpha et mettez ceci XML dans votre dossier de ressources anim.

slide_up.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android" >

    <translate
        Android:duration="500"
        Android:fromYDelta="100%"
        Android:toYDelta="0" />
</set>

SE:

Utilisez AnimationUtils.loadAnimation() pour charger l'animation à partir de XML, puis définissez et démarrez l'animation à l'aide de la méthode .startAnimation().

Voici un exemple:

ImageView imageView = (ImageView) findViewById(R.id.imageView);

// slide-up animation
Animation slideUp = AnimationUtils.loadAnimation(this, R.anim.slide_up);

if (imageView.getVisibility() == View.INVISIBLE) {
    imageView.setVisibility(View.VISIBLE);
    imageView.startAnimation(slideUp);
}

J'espère que cela aidera ~

29
Ferdous Ahamed

Ajouter des animations à l'aide de ConstraintLayout

Ajoutez simplement le code ci-dessous au-dessus des vues dont la visibilité est mise à jour:

TransitionManager.beginDelayedTransition(constraintLayout)

Remarque:

  • ConstraintLayout n'effectuera une animation que sur ses enfants directs, car il ne sait que lorsque vous modifiez les paramètres de présentation et les contraintes sur les enfants qu'il gère.
  • ConstraintLayout n'anime que les modifications liées à la présentation.

Pour plus d'informations, consultez ce message https://robinhood.engineering/beautiful-animations-using-Android-constraintlayout-eee5b72ecae

8
Rissmon Suresh

C'est le meilleur moyen de animer vues visibilité:

private void viewGoneAnimator(View view) {

    view.animate()
            .alpha(0f)
            .setDuration(animationDuration)
            .setListener(new AnimatorListenerAdapter() {
                @Override
                public void onAnimationEnd(Animator animation) {
                    view.setVisibility(View.GONE);
                }
            });

}

private void viewVisibleAnimator(View view) {

    view.animate()
            .alpha(1f)
            .setDuration(animationDuration)
            .setListener(new AnimatorListenerAdapter() {
                @Override
                public void onAnimationEnd(Animator animation) {
                    view.setVisibility(VISIBLE);
                }
            });

}

Et ensuite, appelez cette méthode où vous voulez créer une vue visible ou gone et donnez la vue voulue aux méthodes en tant que paramètre.

2
parsa dadras

Basé sur this réponse:

avec cette méthode, je peux définir le visibility de ma vue sur VISIBLE avec une animation slideUp (comme _ animer snackbar):

int getScreenHeight() {
    DisplayMetrics displaymetrics = new DisplayMetrics();
    activity.getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
    return displaymetrics.heightPixels;
}

public void animateOnScreen(View view) {
    final int screenHeight = getScreenHeight();
    ObjectAnimator animator = ObjectAnimator.ofFloat(view, "y", screenHeight, (screenHeight * 0.8F));
    animator.setInterpolator(new DecelerateInterpolator());
    animator.start();
}

Ensuite, je peux l'utiliser comme ça:

if (myView.getVisibility() == View.INVISIBLE) {
    myView.setVisibility(View.VISIBLE);
    animateOnScreen(myView);
}
1
DastakWall

Vous devez juste ajouter Android:animateLayoutChanges="true" à votre mise en page. Quand je règle la visibilité à linear_container, linear_bottom s'animera de bas en haut et se substituera à "linear_container".

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
        Android:layout_width="match_parent"
        Android:animateLayoutChanges="true"
        Android:orientation="vertical"
        Android:layout_height="match_parent">
       <Android.support.design.widget.AppBarLayout
            Android:id="@+id/layoutTop"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content">
        </Android.support.design.widget.AppBarLayout>

       <LinearLayout
            Android:id="@+id/linear_container"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
       </LinearLayout>
       <LinearLayout
            Android:id="@+id/linear_bottom"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
       </LinearLayout>
</LinearLayout>
1
Mayur Patel