Ein- und Ausblenden einer Ansicht mit einer Slide-Up/Down-Animation
Lesezeit: 9 Minuten
MichelReap
Ich habe ein LinearLayout die ich mit ein- oder ausblenden möchte Animation das das Layout nach oben oder unten verschiebt, wenn ich seine Sichtbarkeit ändere.
Ich habe ein paar Beispiele gesehen, aber keines davon entspricht meinen Bedürfnissen.
Ich habe zwei XML-Dateien für die Animationen erstellt, aber ich weiß nicht, wie ich sie starten soll, wenn ich die Sichtbarkeit von a ändere LinearLayout.
Xaver Kapeller
Mit der neuen Animations-API, die in Android 3.0 (Honeycomb) eingeführt wurde, ist es sehr einfach, solche Animationen zu erstellen.
Schieben a View mit Abstand nach unten:
view.animate().translationY(distance);
Sie können die später schieben View zurück in seine ursprüngliche Position wie folgt:
view.animate().translationY(0);
Sie können auch problemlos mehrere Animationen kombinieren. Die folgende Animation zeigt a View um die Höhe nach unten und gleichzeitig einblenden:
// 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);
Die kannst du dann ausblenden View herausziehen und wieder in seine ursprüngliche Position schieben. Wir setzen auch ein AnimatorListener damit wir die Sichtbarkeit der einstellen können View zurück zu GONE Sobald die Animation fertig ist:
Ich möchte die Ansicht animieren, wenn sie sichtbar und wenn sie weg ist. aber wenn ich zum ersten Mal geschaut habe, ist es nicht sichtbar und der Ort der Sicht ist leer
– RAM
9. Juni 2016 um 8:58 Uhr
@Ram Was versuchst du zu erreichen, indem du a View wenn seine Sichtbarkeit auf eingestellt ist View.GONE? Wenn Sie die Sichtbarkeit auf etwas anderes einstellen View.VISIBLE dann ist die View wird nicht sichtbar sein. Ich verstehe nicht, was Sie fragen. Wenn Sie möchten, dass Ihre Animation sichtbar ist, stellen Sie die Sichtbarkeit von nicht ein View zu View.GONE.
– Xaver Kapeller
9. Juni 2016 um 9:11 Uhr
Ich habe das gleiche Problem wie Ram, beim ersten Mal funktioniert es gut, aber ab dem nächsten Mal, wenn ich diese Ansicht in den gegangenen Zustand versetze und versuche, diese Ansicht wieder sichtbar zu machen, wird sie nicht angezeigt.
– Pankaj kumar
8. August 2016 um 10:35 Uhr
@XaverKapeller Ich denke, das Problem, das viele haben, ist, dass der Zuhörer onAnimationEnd wird jedes Mal für eine mehrfach auftretende Animation aufgerufen, was bedeutet, dass onAnimationEnd wird auch aufgerufen, wenn die Ansicht angezeigt wird, wodurch die Sichtbarkeit auf Gone usw. gesetzt wird.
– älterer Gott
20. September 2016 um 3:00 Uhr
Suragch
Ich hatte Probleme, die akzeptierte Antwort zu verstehen und anzuwenden. Ich brauchte etwas mehr Kontext. Jetzt, wo ich es herausgefunden habe, hier ist ein vollständiges Beispiel:
MainActivity.java
public class MainActivity extends AppCompatActivity {
Button myButton;
View myView;
boolean isUp;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myView = findViewById(R.id.my_view);
myButton = findViewById(R.id.my_button);
// initialize as invisible (could also do in xml)
myView.setVisibility(View.INVISIBLE);
myButton.setText("Slide up");
isUp = false;
}
// slide the view from below itself to the current position
public void slideUp(View view){
view.setVisibility(View.VISIBLE);
TranslateAnimation animate = new TranslateAnimation(
0, // fromXDelta
0, // toXDelta
view.getHeight(), // fromYDelta
0); // toYDelta
animate.setDuration(500);
animate.setFillAfter(true);
view.startAnimation(animate);
}
// slide the view from its current position to below itself
public void slideDown(View view){
TranslateAnimation animate = new TranslateAnimation(
0, // fromXDelta
0, // toXDelta
0, // fromYDelta
view.getHeight()); // toYDelta
animate.setDuration(500);
animate.setFillAfter(true);
view.startAnimation(animate);
}
public void onSlideViewButtonClick(View view) {
if (isUp) {
slideDown(myView);
myButton.setText("Slide up");
} else {
slideUp(myView);
myButton.setText("Slide down");
}
isUp = !isUp;
}
}
Dank an Dieser Beitrag dafür, dass du mich in die richtige Richtung weist. Es war hilfreicher als die anderen Antworten auf dieser Seite.
Wenn Sie mit der Ansicht auf dem Bildschirm beginnen möchten, initialisieren Sie sie nicht als INVISIBLE.
Da wir es vollständig außerhalb des Bildschirms animieren, ist es nicht erforderlich, es wieder auf zu setzen INVISIBLE. Wenn Sie jedoch nicht vollständig außerhalb des Bildschirms animieren, können Sie eine Alpha-Animation hinzufügen und die Sichtbarkeit mit festlegen AnimatorListenerAdapter.
android:visibility=”invisible”, um die Ansichtsanimation als Versteck zu initialisieren
– Gutes Leben
21. Januar 2018 um 6:13 Uhr
Ich empfehle die Verwendung von animate.setFillAfter(true); Wenn Sie anklickbare Ansichten unter der verschobenen Ansicht haben, werden keine Ereignisse empfangen
– HOCINE BEKKOUCHE
24. März 2018 um 17:40 Uhr
Beachten Sie das ohne .setVisibility(View.INVISIBLE); Die Slide-up-Funktion funktioniert nicht wie erwartet.
– Advait Saravade
3. August 2018 um 3:57 Uhr
Translate Animation verschiebt den Blick. Wenn Sie die Ansicht wie ihre Skalierung selbst animieren möchten, verwenden Sie ScaleAnimation anim = new ScaleAnimation(1, 1, 0, 1)
– Zohab Ali
29. September 2018 um 9:05 Uhr
Beachten Sie, dass TranslateAnimation verschiebt keine anklickbaren Elemente, wenn sie in Ihrer Ansicht vorhanden sind. Es werden nur Pixel verschoben. Dies kann in den meisten Fällen unerwartet sein. Siehe auch zum Verschieben von Clickables: stackoverflow.com/a/34631361/5353128
– Kaushal28
20. Mai 2021 um 18:12 Uhr
aschakirow
Jetzt sollten Animationen zur Änderung der Sichtbarkeit über ausgeführt werden Transition API die im Support-Paket (androidx) verfügbar sind. Ruf einfach an TransitionManager.beginDelayedTransition Methode mit Rutschen Übergang und ändern Sie dann die Sichtbarkeit der Ansicht.
Überprüfen Sie diese Antwort mit anderen standardmäßigen und benutzerdefinierten Übergangsbeispielen.
@akubi ja, so sollte es sein
– Aba
16. Februar 2020 um 17:31 Uhr
Eine der besten und einfachsten Antworten! Danke!
– krisDrOid
29. Februar 2020 um 18:14 Uhr
nur um zu beachten, dies erfordert minSdkVersion 21
– lasec0203
10. April 2020 um 0:54 Uhr
@lasec0203 nein, Klassen sind von androidx Paket. Es funktioniert gut auf Pre 21 API.
– Aschakirow
10. April 2020 um 8:01 Uhr
:thumbs_up: Dies hat einen Methodenmehrdeutigkeitsfehler beseitigt, den ich bekommen habe
– lasec0203
11. April 2020 um 3:36 Uhr
Stefan Medeck
Einfachste Lösung: einstellen android:animateLayoutChanges="true" auf dem Container, der Ihre Ansichten enthält.
Um es in einen Zusammenhang zu bringen: Wenn Sie ein Layout wie unten haben, werden alle Sichtbarkeitsänderungen der Ansichten in diesem Container automatisch animiert.
Basierend auf der Antwort von Suragch ist hier eine elegante Möglichkeit, die View-Erweiterung zu verwenden:
fun View.slideUp(duration: Int = 500) {
visibility = View.VISIBLE
val animate = TranslateAnimation(0f, 0f, this.height.toFloat(), 0f)
animate.duration = duration.toLong()
animate.fillAfter = true
this.startAnimation(animate)
}
fun View.slideDown(duration: Int = 500) {
visibility = View.VISIBLE
val animate = TranslateAnimation(0f, 0f, 0f, this.height.toFloat())
animate.duration = duration.toLong()
animate.fillAfter = true
this.startAnimation(animate)
}
Und dann, wo immer Sie es verwenden möchten, brauchen Sie nur myView.slideUp() oder myView.slideDown()
Der einzige Fehler ist, dass “fillAfter=true” nicht benötigt wird, da es die Zugänglichkeit für Klicks auf untergeordnete Ansichten blockiert
– Ranjan
11. Juli 2019 um 7:04 Uhr
Außerdem müssten Sie wahrscheinlich einen Listener zur SlideDown-Animation hinzufügen und die Ansicht onAnimationEnd gehen lassen.
– Manohar
12. Juni 2020 um 13:31 Uhr
Xaver Kapeller
Sie können das richtige starten Animation wenn die Sichtbarkeit der LinearLayout Änderungen durch Erstellen einer neuen Unterklasse von LinearLayout und überschreiben setVisibility() zu starten Animations. Betrachten Sie so etwas:
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);
}
}
Der einzige Fehler ist, dass “fillAfter=true” nicht benötigt wird, da es die Zugänglichkeit für Klicks auf untergeordnete Ansichten blockiert
– Ranjan
11. Juli 2019 um 7:04 Uhr
Außerdem müssten Sie wahrscheinlich einen Listener zur SlideDown-Animation hinzufügen und die Ansicht onAnimationEnd gehen lassen.
Probleme mit dieser Antwort: 1) Schreckliche Codeformatierung. 2) Sie verwenden ein Code-Snippet, um Code zu posten, der eigentlich nicht im Browser ausgeführt werden kann. Dies fügt nicht nur zwei nutzlose Schaltflächen hinzu, sondern zerstört auch die Syntaxhervorhebung. 3) Es ist nur ein zufälliger Code-Dump ohne Erklärung oder Zweck. 4) Sie ändern die Sichtbarkeit, während Sie eine Animation ausführen. Abgesehen von der Tatsache, dass dies ein offensichtlicher Codegeruch ist, wird dies auch nicht richtig funktionieren. Das Ändern der Sichtbarkeit startet einen neuen Layoutprozess, erst nachdem dieser abgeschlossen ist, hat die Animation tatsächlich Werte, mit denen sie arbeiten kann. Die Liste geht weiter und weiter…
– Xaver Kapeller
1. April 2015 um 6:57 Uhr
Ich habe Ihre Antwort bereits bearbeitet, um die Formatierung zu korrigieren, und das Code-Snippet in einen tatsächlichen Codeblock umgewandelt. Aber den Rest musst du ausfüllen…
– Xaver Kapeller
1. April 2015 um 7:11 Uhr
Tut mir leid, Kumpel, ich habe den Code von dir erfunden, weil er für mich nicht gut funktioniert, dieser Code von mir funktioniert. Aber Änderungen in der Art des Postens sind erforderlich, ich stimme zu.
– Ameen Maheen
1. April 2015 um 9:13 Uhr
@AmeenMaheen Was ist setAlpha zum?
– IgorGanapolsky
14. September 2015 um 19:46 Uhr
@ Igor Ganapolsky Es wird für Transparenz verwendet, dh um einen Fading-Effekt zu erzielen
– Ameen Maheen
15. September 2015 um 4:55 Uhr
9229400cookie-checkEin- und Ausblenden einer Ansicht mit einer Slide-Up/Down-Animationyes