Animate visibility of a view from gone to visible with animation
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);
}
Related videos on Youtube
DastakWall
Updated on December 10, 2021Comments
-
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 thisanimation
: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 almost 7 yearsI have updated my answer. Its now showing slide up animation as like snackbar
-
DastakWall almost 7 yearsthanks for the reply, your solution is working too, and I'm gonna accept it because it looks cleaner to me.
-
Ferdous Ahamed almost 7 yearsGlad to know that. If my answer seems useful, please give an upvote. Thanks in advance
-
Aanal Shah over 4 yearsHey, in case of making it visible, it doesn't animate :( I have used the same methods mentioned above.
-
Amir Dora. about 4 yearsThis option is interesting, it even updates recycleView faster, even though i have implemented it on another layout.
-
Brandon McAnsh about 4 yearsThe fix for this is to use the
onAnimationStart()
callback forviewVisibleAnimator
-
Arash Afsharpour over 3 yearsthanks 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 over 3 yearshey @ArashAfsharpour same problem here, did you find any solution?
-
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 almost 3 yearsThank you so much out of all this is the best answer for me!