Ich habe ein "LinearLayout", das ich mit einer "Animation" ein- oder ausblenden möchte, die das Layout nach oben oder unten schiebt, wenn ich seine Sichtbarkeit ändere.
Ich habe ein paar Beispiele gesehen, aber keines von ihnen entspricht meinen Bedürfnissen.
Ich habe zwei xml-Dateien für die Animationen erstellt, aber ich weiß nicht, wie ich sie starten kann, wenn ich die Sichtbarkeit eines LinearLayout
ändere.
Mit der neuen Animations-API, die in Android 3.0 (Honeycomb) eingeführt wurde, ist es sehr einfach, solche Animationen zu erstellen.
Eine "Ansicht" um eine Strecke nach unten schieben:
view.animate().translationY(distance);
Später kann man den "View" wie folgt in seine ursprüngliche Position zurückschieben:
view.animate().translationY(0);
Sie können auch leicht mehrere Animationen kombinieren. Die folgende Animation lässt einen View
um seine Höhe nach unten gleiten und blendet ihn gleichzeitig ein:
// 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);
Dann kann man den View
wieder ausblenden und ihn in seine ursprüngliche Position zurückschieben. Wir setzen auch einen AnimatorListener
, damit wir die Sichtbarkeit des View
wieder auf GONE
setzen können, sobald die Animation beendet ist:
view.animate()
.translationY(0)
.alpha(0.0f)
.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
view.setVisibility(View.GONE);
}
});
Sie können die richtige Animation
starten, wenn sich die Sichtbarkeit des LinearLayout
ändert, indem Sie eine neue Unterklasse von LinearLayout
erstellen und setVisibility()
überschreiben, um die Animationen
zu starten. Betrachten Sie etwas wie dies:
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);
}
});
}