Ho un LinearLayout
che voglio mostrare o nascondere con una Animazione
che spinge il layout verso l'alto o verso il basso ogni volta che cambio la sua visibilità.
Ho visto alcuni esempi là fuori, ma nessuno di loro soddisfa le mie esigenze.
Ho creato due file xml per le animazioni ma non so come avviarle quando cambio la visibilità di un LinearLayout
.
Con la nuova API di animazione che è stata introdotta in Android 3.0 (Honeycomb) è molto semplice creare tali animazioni.
Far scorrere una Vista
verso il basso di una certa distanza:
view.animate().translationY(distance);
In seguito puoi far scorrere la Vista
di nuovo nella sua posizione originale in questo modo:
view.animate().translationY(0);
Potete anche combinare facilmente più animazioni. La seguente animazione farà scorrere una Vista
verso il basso per la sua altezza e la farà sfumare allo stesso tempo:
// 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);
È possibile poi far scorrere di nuovo la Vista
e farla scorrere di nuovo nella sua posizione originale. Abbiamo anche impostato un AnimatorListener
in modo da poter impostare la visibilità della Vista
di nuovo a GONE
una volta che l'animazione è finita:
view.animate()
.translationY(0)
.alpha(0.0f)
.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
view.setVisibility(View.GONE);
}
});
Potete avviare la corretta Animazione
quando la visibilità del LinearLayout
cambia creando una nuova sottoclasse di LinearLayout
e sovrascrivendo setVisibility()
per avviare le Animazioni
. Considerate qualcosa del genere:
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);
}
});
}