J'ai un LinearLayout
que je veux afficher ou cacher avec une Animation
qui pousse le layout vers le haut ou vers le bas chaque fois que je change sa visibilité.
J'ai vu quelques exemples, mais aucun ne répond à mes besoins.
J'ai créé deux fichiers xml pour les animations mais je ne sais pas comment les lancer lorsque je change la visibilité d'un LinearLayout
.
Grâce à la nouvelle API d'animation introduite dans Android 3.0 (Honeycomb), il est très simple de créer de telles animations.
Faire glisser une Vue
vers le bas d'une certaine distance :
view.animate().translationY(distance);
Plus tard, vous pouvez faire glisser l'affichage à sa position initiale comme ceci :
view.animate().translationY(0);
Vous pouvez aussi facilement combiner plusieurs animations. L'animation suivante fera glisser une Vue
vers le bas en fonction de sa hauteur et la fera apparaître en fondu en même temps :
// Prepare the View for the animation
view.setVisibility(View.VISIBLE);
view.setAlpha(0.0f);
// Start the animation
view.animate()
.translationY(view.getHeight())
.alpha(1.0f)
.setListener(null);
Vous pouvez ensuite faire disparaître l'Vue
en fondu et la faire glisser à nouveau vers sa position initiale. Nous avons également défini un AnimatorListener
pour pouvoir remettre la visibilité de l'Vue
à GONE
une fois l'animation terminée :
view.animate()
.translationY(0)
.alpha(0.0f)
.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
view.setVisibility(View.GONE);
}
});
Vous pouvez lancer la bonne Animation
lorsque la visibilité du LinearLayout
change en créant une nouvelle sous-classe de LinearLayout
et en surchargeant setVisibility()
pour lancer les Animations
. Considérez quelque chose comme ceci :
public class SimpleViewAnimator extends LinearLayout
{
private Animation inAnimation;
private Animation outAnimation;
public SimpleViewAnimator(Context context)
{
super(context);
}
public void setInAnimation(Animation inAnimation)
{
this.inAnimation = inAnimation;
}
public void setOutAnimation(Animation outAnimation)
{
this.outAnimation = outAnimation;
}
@Override
public void setVisibility(int visibility)
{
if (getVisibility() != visibility)
{
if (visibility == VISIBLE)
{
if (inAnimation != null) startAnimation(inAnimation);
}
else if ((visibility == INVISIBLE) || (visibility == GONE))
{
if (outAnimation != null) startAnimation(outAnimation);
}
}
super.setVisibility(visibility);
}
}
if (filter_section.getVisibility() == View.GONE) {
filter_section.animate()
.translationY(filter_section.getHeight()).alpha(1.0f)
.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationStart(Animator animation) {
super.onAnimationStart(animation);
filter_section.setVisibility(View.VISIBLE);
filter_section.setAlpha(0.0f);
}
});
} else {
filter_section.animate()
.translationY(0).alpha(0.0f)
.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
filter_section.setVisibility(View.GONE);
}
});
}