Jeg har en LinearLayout
som jeg vil vise eller skjule med en Animation
som skyver layouten oppover eller nedover når jeg endrer synligheten.
Jeg har sett noen eksempler der ute, men ingen av dem passer mine behov.
Jeg har laget to xml-filer for animasjonene, men jeg vet ikke hvordan jeg skal starte dem når jeg endrer synligheten til en LinearLayout
.
Med det nye animasjons-API-et som ble introdusert i Android 3.0 (Honeycomb) er det veldig enkelt å lage slike animasjoner.
Skyv en View
ned med en avstand:
view.animate().translationY(distance);
Du kan senere skyve View
tilbake til sin opprinnelige posisjon på denne måten:
view.animate().translationY(0);
Du kan også enkelt kombinere flere animasjoner. Følgende animasjon vil skyve en View
ned i høyden og fade den inn samtidig:
// 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);
Du kan deretter fade View
ut igjen og skyve den tilbake til sin opprinnelige posisjon. Vi setter også en AnimatorListener
slik at vi kan sette synligheten til View
tilbake til GONE
når animasjonen er ferdig:
view.animate()
.translationY(0)
.alpha(0.0f)
.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
view.setVisibility(View.GONE);
}
});
Du kan starte riktig Animation
når synligheten til LinearLayout
endres ved å opprette en ny underklasse av LinearLayout
og overstyre setVisibility()
for å starte Animations
. Tenk på noe som dette:
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);
}
});
}