Ich versuche den Übergang zwischen Fragmenten zu animieren. Ich habe die Antwort von den folgenden
Android-Fragmenten und Animationen erhalten
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();
Und mein R.anim.slide_in_left
<?xml version="1.0" encoding="utf-8"?>
<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>
Aber als ich das versuchte, zeigte es sich
02-08 16:27:37.961: ERROR/AndroidRuntime(1717): FATAL EXCEPTION: main
02-08 16:27:37.961: ERROR/AndroidRuntime(1717): java.lang.RuntimeException: Unknown animator name: translate
02-08 16:27:37.961: ERROR/AndroidRuntime(1717): at android.animation.AnimatorInflater.createAnimatorFromXml(AnimatorInflater.java:129)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717): at android.animation.AnimatorInflater.createAnimatorFromXml(AnimatorInflater.java:126)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717): at android.animation.AnimatorInflater.createAnimatorFromXml(AnimatorInflater.java:93)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717): at android.animation.AnimatorInflater.loadAnimator(AnimatorInflater.java:72)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717): at android.app.FragmentManagerImpl.loadAnimator(FragmentManager.java:621)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:733)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:919)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717): at android.app.BackStackRecord.run(BackStackRecord.java:578)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717): at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1217)
Irgendwelche Ideen? Als ich überprüft habe, ist die Honeycomb API-Referenz translate
vorhanden. Was habe ich verpasst?
Gibt es eine andere Möglichkeit, den Übergang zwischen Fragmenten zu animieren? Vielen Dank
android
android-3.0-honeycomb
Labeeb Panampullan
quelle
quelle
Antworten:
Sie müssen das neue
android.animation
Framework (Objektanimatoren) mitFragmentTransaction.setCustomAnimations
sowie verwendenFragmentTransaction.setTransition
.Hier ist ein Beispiel für die Verwendung
setCustomAnimations
von ApiDemos ' FragmentHideShow.java :und hier ist das relevante Animator-XML aus res / animator / fade_in.xml :
Beachten Sie, dass Sie mit mehreren Animatoren
<set>
genau wie mit dem älteren Animationsframework mehrere Animatoren kombinieren können .EDIT : Da die Leute nach Slide-In / Slide-Out fragen, werde ich das hier kommentieren.
Einschieben und Herausschieben
Sie können die natürlich animieren
translationX
,translationY
,x
, undy
Eigenschaften, aber in der Regel beinhalten Folien Inhalte zu und von Off-Screen Animieren. Soweit ich weiß, gibt es keine Übergangseigenschaften, die relative Werte verwenden. Dies hindert Sie jedoch nicht daran, sie selbst zu schreiben. Denken Sie daran, dass für Eigenschaftsanimationen lediglich Getter- und Setter-Methoden für die zu animierenden Objekte (in diesem Fall Ansichten) erforderlich sind. Sie können also einfach eigene MethodengetXFraction
undsetXFraction
Methoden für Ihre Ansichtsunterklasse erstellen :Jetzt können Sie die Eigenschaft 'xFraction' folgendermaßen animieren:
res / animator / slide_in.xml :
Beachten Sie, dass wenn das Objekt, in dem Sie animieren, nicht die gleiche Breite wie das übergeordnete Objekt hat, die Dinge nicht ganz richtig aussehen. Daher müssen Sie möglicherweise Ihre Eigenschaftsimplementierung an Ihren Anwendungsfall anpassen.
quelle
Ich habe so gemacht:
Fügen Sie diese Methode hinzu , um Fragmente durch Animationen zu ersetzen :
Sie müssen hinzufügen vier Animationen in Anim Ordner, ist Associate mit Ressource :
enter_from_left.xml :
exit_to_right.xml :
enter_from_right.xml :
exit_to_left.xml :
Ausgabe:
Es ist fertig .
quelle
.setCustomAnimations(R.anim.enter_from_right, R.anim.exit_to_left, R.anim.enter_from_left, R.anim.exit_to_right)
Wenn Sie es sich leisten können, sich nur an Lollipop und später zu binden, scheint dies den Trick zu tun:
Hoffe das hilft.
quelle
new Slide(...)
: Aufruf erfordert API Level 21Nurik ‚s Antwort war sehr hilfreich, aber ich konnte es nicht an der Arbeit , bis ich fand diese . Kurz gesagt, wenn Sie die Kompatibilitätsbibliothek verwenden (z. B. SupportFragmentManager anstelle von FragmentManager), unterscheidet sich die Syntax der XML-Animationsdateien.
quelle
Hier ist eine Animation zum Ein- und Ausziehen zwischen Fragmenten:
Wir verwenden einen objectAnimator.
Hier sind die beiden XML-Dateien im Animator- Unterordner.
enter_anim.xml
exit_anim.xml
Ich hoffe das würde jemandem helfen.
quelle
.setCustomAnimations(R.animator.slide_in_left, R.animator.slide_out_right, R.animator.slide_in_left, R.animator.slide_out_right)
Stellen Sie für alle anderen Personen, die erwischt werden, sicher, dass setCustomAnimations vor dem Aufruf aufgerufen wird, um beim Erstellen der Transaktion zu ersetzen / hinzuzufügen.
quelle
Android SDK Implementierung von FragmentTransaction will eine
Animator
Weile Support-Bibliothek will eineAnimation
, frag mich nicht warum, aber nach Strangeluks Kommentar habe ich in Android 4.0.3 Code und Support-Bibliothek gesucht. Android SDK verwendetloadAnimator()
und unterstützt Bibliothek verwendetloadAnimation()
quelle
Versuchen Sie es mit dieser einfachen und schnellen Lösung. Android bietet einige Standardeinstellungen
animation
.Ausgabe:
quelle