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());
Vous pouvez le faire en utilisant XML
animation.
Créez une animation slide-up
XML
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 ~
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
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.
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);
}
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>