Animate visibility of a view from gone to visible with animation

44,537

Solution 1

You can do this using XML animation.

Create a slide-up animation XML using set and alpha and put this XML into your resource anim folder.

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>

USE:

Use AnimationUtils.loadAnimation() to load animation from XML and set and start animation using .startAnimation() method.

Here is an example:

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

Hope this will help~

Solution 2

Add animations using ConstraintLayout

Just add below code above the views whose visibility is updated:

TransitionManager.beginDelayedTransition(constraintLayout)

Note:

  • ConstraintLayout will only perform animation on its direct children since it only knows when you change layout parameters and constraints on the children that it handles.
  • ConstraintLayout only animates layout related changes.

For more see this post https://robinhood.engineering/beautiful-animations-using-android-constraintlayout-eee5b72ecae3

Solution 3

This is the best way to animate views visibility :

private void viewGoneAnimator(final View view) {

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

}

private void viewVisibleAnimator(final View view) {

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

}

And then call this method wherever you wanted to make a view visible or gone and give the intended view to methods as the parameter.

Solution 4

Just You need to add android:animateLayoutChanges="true" to your layout. When I set visibility gone to linear_container, linear_bottom will animate from bottom to up and take place of "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>

Solution 5

Based on this answer:

with this methods, I can set the visibility of my view to VISIBLE with a slideUp animation(Like snackbar animation):

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

Then I can use it like this:

if (myView.getVisibility() == View.INVISIBLE) {
    myView.setVisibility(View.VISIBLE);
    animateOnScreen(myView);
}
Share:
44,537

Related videos on Youtube

DastakWall
Author by

DastakWall

Updated on December 10, 2021

Comments

  • DastakWall
    DastakWall over 2 years

    I have a view that is invisible by default(Just for the first time).

    Now I need to switch the visibility to VISIBLE with this animation:

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

    (Like the SnackBar default animation)

    But this isn't working. It will turn visible with default animation

    Is there any simple way that I could achieve this?

    Note

    I'm animating my view to dismiss, like this:

    myView.animate().translationY(myView.getHeight());
    
  • Ferdous Ahamed
    Ferdous Ahamed almost 7 years
    I have updated my answer. Its now showing slide up animation as like snackbar
  • DastakWall
    DastakWall almost 7 years
    thanks for the reply, your solution is working too, and I'm gonna accept it because it looks cleaner to me.
  • Ferdous Ahamed
    Ferdous Ahamed almost 7 years
    Glad to know that. If my answer seems useful, please give an upvote. Thanks in advance
  • Aanal Shah
    Aanal Shah over 4 years
    Hey, in case of making it visible, it doesn't animate :( I have used the same methods mentioned above.
  • Amir Dora.
    Amir Dora. about 4 years
    This option is interesting, it even updates recycleView faster, even though i have implemented it on another layout.
  • Brandon McAnsh
    Brandon McAnsh about 4 years
    The fix for this is to use the onAnimationStart()callback for viewVisibleAnimator
  • Arash Afsharpour
    Arash Afsharpour over 3 years
    thanks for the solution, I wanted to do the exact thing when I am trying to make the view GONE, but it doesn't work, and invisible the view at once, is there something I should do differently in this position?
  • Vivek Thummar
    Vivek Thummar over 3 years
    hey @ArashAfsharpour same problem here, did you find any solution?
  • Arash Afsharpour
    Arash Afsharpour over 3 years
    @VivekThummar did the fix in other ways, without visible and gone, I used this: yourSecondView.animate().translationX(context.toPx(-280)); yourFirstView.animate().translationY(context.toPx(-98));
  • Mohammed Abid Nafi
    Mohammed Abid Nafi almost 3 years
    Thank you so much out of all this is the best answer for me!