Android-Fragmente und -Animation

Lesezeit: 7 Minuten

Android Fragmente und Animation
alexanderblom

Wie sollten Sie die Art von Gleiten implementieren, die beispielsweise der Honeycomb Gmail-Client verwendet?

dürfen TransactionManager Behandeln Sie dies automatisch, indem Sie die Fragmente hinzufügen und entfernen. Es ist etwas schwierig, dies zu testen, da der Emulator eine Diashow ist 🙂

1646262787 701 Android Fragmente und Animation
Reto Meier

Um den Übergang zwischen Fragmenten zu animieren oder den Vorgang des Ein- oder Ausblendens eines Fragments zu animieren, verwenden Sie die Fragment Manager ein zu erstellen Fragment Transaction.

Innerhalb jeder Fragment-Transaktion können Sie In- und Out-Animationen angeben, die zum Ein- und Ausblenden verwendet werden (oder beides, wenn Ersetzen verwendet wird).

Der folgende Code zeigt, wie Sie ein Fragment ersetzen würden, indem Sie ein Fragment herausschieben und das andere an seine Stelle schieben.

FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right);

DetailsFragment newFragment = DetailsFragment.newInstance();

ft.replace(R.id.details_fragment_container, newFragment, "detailFragment");

// Start the animated transition.
ft.commit();

Um dasselbe mit dem Ausblenden oder Anzeigen eines Fragments zu erreichen, rufen Sie einfach auf ft.show oder ft.hideindem Sie das Fragment übergeben, das Sie ein- bzw. ausblenden möchten.

Als Referenz würden die XML-Animationsdefinitionen die verwenden objectAnimator Schild. Ein Beispiel für slide_in_left könnte so aussehen:

<?xml version="1.0" encoding="utf-8"?>
<set>
  <objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:propertyName="x" 
    android:valueType="floatType"
    android:valueFrom="-1280"
    android:valueTo="0" 
    android:duration="500"/>
</set>

  • Als ich das versuchte, zeigte es sich RuntimeException: Unbekannter Animatorname: translate.

    – Labeeb Panampullan

    8. Februar 2011 um 10:16 Uhr

  • Stellen Sie sicher, dass die in slide_in_left und right definierten Animationen mit einem Satz von objectAnimator-Definitionen erstellt werden und nicht mit der alten Animationsdefinition.

    – Reto Meier

    9. Februar 2011 um 16:20 Uhr

  • Das hat sehr geholfen. Ich war auf dem richtigen Weg, bin aber einfach nicht bis zum Ziel gekommen. Für die anderen Leser könnten Sie auch android:interpolator als Attribut haben, wobei Ihr Favorit angegeben ist (z. B. “@android:interpolator/linear”). Es ist standardmäßig “@android:interpolator/accelerate_decelerate”.

    – Dave MacLean

    28. Februar 2011 um 0:44 Uhr

  • Ich ziele auf API Level 7 mit den Kompatibilitäts-APIs ab. Gibt es eine Möglichkeit für mich, Fragmente zu animieren?

    – Jarrod Smith

    15. März 2012 um 21:55 Uhr

  • @JarrodSmith Sie können versuchen, eine Kompatibilitätsbibliothek wie zu verwenden NineOldAndroids um die Honeycomb-API auf Eclair herunterzubringen.

    – Frau

    28. April 2012 um 14:05 Uhr

Android Fragmente und Animation
dmanargien

Wenn Sie die Support-Bibliothek nicht verwenden müssen, sehen Sie sich Romans Antwort an.

Aber wenn Sie die verwenden möchten Bibliothek unterstützen Sie müssen das alte Animationsframework wie unten beschrieben verwenden.

Nachdem ich die Antworten von Reto und Blindstuff konsultiert habe, habe ich den folgenden Code zum Laufen gebracht.

Die Fragmente erscheinen von rechts einschieben und nach links herausrutschen wenn zurück gedrückt wird.

FragmentManager fragmentManager = getSupportFragmentManager();

FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.setCustomAnimations(R.anim.enter, R.anim.exit, R.anim.pop_enter, R.anim.pop_exit);

CustomFragment newCustomFragment = CustomFragment.newInstance();
transaction.replace(R.id.fragment_container, newCustomFragment );
transaction.addToBackStack(null);
transaction.commit();

Die Reihenfolge ist wichtig. Das heißt, Sie müssen anrufen setCustomAnimations() Vor replace() oder die Animation wird nicht wirksam!

Als nächstes müssen diese Dateien in die res/anim Mappe.

enter.xml:

<?xml version="1.0" encoding="utf-8"?>
<set>
    <translate xmlns:android="http://schemas.android.com/apk/res/android"
               android:fromXDelta="100%"
               android:toXDelta="0"
               android:interpolator="@android:anim/decelerate_interpolator"
               android:duration="@android:integer/config_mediumAnimTime"/>
</set>

exit.xml:

<set>
    <translate xmlns:android="http://schemas.android.com/apk/res/android"
               android:fromXDelta="0"
               android:toXDelta="-100%"
               android:interpolator="@android:anim/accelerate_interpolator"
               android:duration="@android:integer/config_mediumAnimTime"/>
</set>

pop_enter.xml:

<set>
    <translate xmlns:android="http://schemas.android.com/apk/res/android"
               android:fromXDelta="-100%"
               android:toXDelta="0"
               android:interpolator="@android:anim/decelerate_interpolator"
               android:duration="@android:integer/config_mediumAnimTime"/>
</set>

pop_exit.xml:

<?xml version="1.0" encoding="utf-8"?>
<set>
    <translate xmlns:android="http://schemas.android.com/apk/res/android"
               android:fromXDelta="0"
               android:toXDelta="100%"
               android:interpolator="@android:anim/accelerate_interpolator"
               android:duration="@android:integer/config_mediumAnimTime"/>
</set>

Die Dauer der Animationen kann auf einen der Standardwerte wie geändert werden @android:integer/config_shortAnimTime oder irgendeine andere Zahl.

Beachten Sie, dass die Zurück-Aktion nicht animiert wird, wenn zwischen Fragmentersetzungen eine Konfigurationsänderung stattfindet (z. B. Rotation). Das ist ein dokumentierter Fehler das existiert noch in der Version 20 der Support-Bibliothek.

  • Das hat mich gerade gerettet. Hinweis, achten Sie darauf die Reihenfolge ist wichtig, die ich natürlich beim ersten Mal verpasst habe. Das bedeutet, dass Sie setCustomAnimations() vor replace() aufrufen müssen.

    – Stefan Kidson

    5. Dezember 2013 um 20:01 Uhr

  • Ich habe versucht, meine Fragmente zu implementieren. Ich habe alles so geschrieben, wie Sie es erwähnt haben, aber Logcat sagt: Name des unbekannten Animators übersetzen Wie kann ich dieses Problem lösen? Übrigens rufe ich mein Fragment auf Navigation Drawer (Sliding Menu)

    – Zafer Celaloglu

    6. November 2014 um 11:36 Uhr


  • Funktioniert großartig, aber es stellt sich heraus, dass das Erstellen mit den Build-Tools 21.1 einen Fehler generiert, der besagt: „Ungültiger Dateiname: darf nur Kleinbuchstaben und Ziffern enthalten ([a-z0-9_.])”. Ich schlage vor, die Dateinamen in der Antwort auf pop_enter.xml und pop_exit.xml zu bearbeiten.

    – smichak

    25. Januar 2015 um 7:46 Uhr

  • Tolle Lösung und es funktioniert super, wenn ich die Zurück-Taste drücke. Ich habe nur eine Frage: Wenn ich einen benutzerdefinierten BackButton erstellen möchte, welchen Code sollte ich aufrufen, um das Verhalten des Zurück-Buttons zu replizieren?

    – Teilmann

    5. März 2015 um 8:01 Uhr

  • Thomas, wenn du zurück willst, solltest du dieses Formular implementieren: .setCustomAnimations(R.anim.pop_enter, R.anim.pop_exit, R.anim.enter, R.anim.exit)

    – Alex Zaraos

    15. Juni 2015 um 15:41 Uhr


1646262787 272 Android Fragmente und Animation
Gowthaman M

Ich würde Ihnen dringend empfehlen, dies zu verwenden, anstatt die Animationsdatei zu erstellen, da dies eine viel bessere Lösung ist. Android Studio bietet bereits Ursprünglich animation Sie können verwenden, ohne eine neue XML-Datei zu erstellen. Die Namen der Animationen sind android.R.anim.slide_in_left und android.R.anim.slide_out_right und Sie können sie wie folgt verwenden:

fragmentTransaction.setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right);

FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();              
fragmentTransaction.setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right);
fragmentManager.addOnBackStackChangedListener(this);
fragmentTransaction.replace(R.id.frame, firstFragment, "h");
fragmentTransaction.addToBackStack("h");
fragmentTransaction.commit();

Ausgabe:

Geben Sie hier die Bildbeschreibung ein

  • android.R … “Android Studio bietet Standardanimation”, das ist nicht für Android Studio, es kann auch in Eclipse funktionieren, Android.R ist Android-spezifisch. Und übrigens haben Sie die Informationen nicht geteilt, welche APIs dies haben. Weil Dinge auf android.R sind auf verschiedenen APIs unterschiedlich.

    – Steve Moretz

    5. Februar 2019 um 9:15 Uhr

  • @stevemoretz thaxs bro Ich stimme deinem Punkt zu. Ich werde meine Antwort korrigieren und aktualisieren …

    – Gowthaman M

    5. Februar 2019 um 9:48 Uhr

Meine modifiziert Bibliothek unterstützen unterstützt die Verwendung beider Ansichtsanimationen (dh <translate>, <rotate>) und Objektanimatoren (dh <objectAnimator>) für Fragmentübergänge. Es wird mit implementiert NineOldAndroids. Weitere Informationen finden Sie in meiner Dokumentation auf Github.

Was mich betrifft, ich brauche die Blickrichtung:

in -> von rechts wischen

raus -> nach links wischen

Hier funktioniert für mich Code:

slide_in_right.xml

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="50%p" android:toXDelta="0"
            android:duration="@android:integer/config_mediumAnimTime"/>
    <alpha android:fromAlpha="0.0" android:toAlpha="1.0"
            android:duration="@android:integer/config_mediumAnimTime" />
</set>

slide_out_left.xml

 <set xmlns:android="http://schemas.android.com/apk/res/android">
        <translate android:fromXDelta="0" android:toXDelta="-50%p"
                android:duration="@android:integer/config_mediumAnimTime"/>
        <alpha android:fromAlpha="1.0" android:toAlpha="0.0"
                android:duration="@android:integer/config_mediumAnimTime" />
    </set>

Transaktions-Code:

inline fun FragmentActivity.setContentFragment(
        containerViewId: Int,
        backStack: Boolean = false,
        isAnimate: Boolean = false,
        f: () -> Fragment

): Fragment? {
    val manager = supportFragmentManager
    return f().apply {
        manager.beginTransaction().let {
            if (isAnimate)
                it.setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left)

            if (backStack) {
                it.replace(containerViewId, this, "Fr").addToBackStack("Fr").commit()
            } else {
                it.replace(containerViewId, this, "Fr").commit()
            }
        }
    }
}

  • Android scheint die Übergänge mit diesen Animationen zu flackern (insbesondere die übersetzten)

    – Gabriel Rohden

    19. März 2019 um 17:34 Uhr

  • @GabrielDeOliveiraRohden für mich nicht in allen Fällen

    – Serg Burlaka

    20. März 2019 um 12:10 Uhr

Android Fragmente und Animation
Shakawat Hossain

Ich löse das wie folgt

Animation anim = AnimationUtils.loadAnimation(this, R.anim.slide);
fg.startAnimation(anim);
this.fg.setVisibility(View.VISIBLE); //fg is a View object indicate fragment

  • Android scheint die Übergänge mit diesen Animationen zu flackern (insbesondere die übersetzten)

    – Gabriel Rohden

    19. März 2019 um 17:34 Uhr

  • @GabrielDeOliveiraRohden für mich nicht in allen Fällen

    – Serg Burlaka

    20. März 2019 um 12:10 Uhr

917130cookie-checkAndroid-Fragmente und -Animation

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

Privacy policy