Ein- und Ausblenden einer Ansicht mit einer Slide-Up/Down-Animation

Lesezeit: 9 Minuten

Ein und Ausblenden einer Ansicht mit einer Slide UpDown Animation
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.

1646307189 667 Ein und Ausblenden einer Ansicht mit einer Slide UpDown Animation
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:

view.animate()
    .translationY(0)
    .alpha(0.0f)
    .setListener(new AnimatorListenerAdapter() {
        @Override
        public void onAnimationEnd(Animator animation) {
            super.onAnimationEnd(animation);
            view.setVisibility(View.GONE);
        }
    });

  • Warum sehen Sie nicht sichtbar, wenn es weg ist?

    – RAM

    9. Juni 2016 um 8:46 Uhr

  • 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

Ein und Ausblenden einer Ansicht mit einer Slide UpDown Animation
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:

Geben Sie hier die Bildbeschreibung ein

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;
    }
}

activity_mail.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.slideview.MainActivity">

    <Button
        android:id="@+id/my_button"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="100dp"
        android:onClick="onSlideViewButtonClick"
        android:layout_width="150dp"
        android:layout_height="wrap_content"/>

    <LinearLayout
        android:id="@+id/my_view"
        android:background="#a6e1aa"
        android:orientation="vertical"
        android:layout_alignParentBottom="true"
        android:layout_width="match_parent"
        android:layout_height="200dp">

    </LinearLayout>

</RelativeLayout>

Anmerkungen

  • 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.
  • Dokumente zur Eigenschaftsanimation

  • 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


1646307190 889 Ein und Ausblenden einer Ansicht mit einer Slide UpDown Animation
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.

Geben Sie hier die Bildbeschreibung ein

import androidx.transition.Slide;
import androidx.transition.Transition;
import androidx.transition.TransitionManager;

private void toggle(boolean show) {
    View redLayout = findViewById(R.id.redLayout);
    ViewGroup parent = findViewById(R.id.parent);

    Transition transition = new Slide(Gravity.BOTTOM);
    transition.setDuration(600);
    transition.addTarget(R.id.redLayout);

    TransitionManager.beginDelayedTransition(parent, transition);
    redLayout.setVisibility(show ? View.VISIBLE : View.GONE);
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/parent"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="play" />

    <LinearLayout
        android:id="@+id/redLayout"
        android:layout_width="match_parent"
        android:layout_height="400dp"
        android:background="#5f00"
        android:layout_alignParentBottom="true" />
</RelativeLayout>

Ü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

1646307191 190 Ein und Ausblenden einer Ansicht mit einer Slide UpDown Animation
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.

<LinearLayout android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:animateLayoutChanges="true"
    >

    <Views_which_change_visibility>

</LinearLayout>

Näheres dazu finden Sie auf Animieren von Layoutänderungen – Android-Entwickler

Kotlin

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

1646307189 667 Ein und Ausblenden einer Ansicht mit einer Slide UpDown Animation
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.

    – Manohar

    12. Juni 2020 um 13:31 Uhr

1646307189 667 Ein und Ausblenden einer Ansicht mit einer Slide UpDown Animation
Xaver Kapeller

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);
                }
            });
}

  • 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

922940cookie-checkEin- und Ausblenden einer Ansicht mit einer Slide-Up/Down-Animation

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy