Próbuję animować przejście między fragmentami. Otrzymałem odpowiedź z następujących
fragmentów Androida i animacji
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();
I mój 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>
Ale kiedy spróbowałem, okazało się
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)
Jakieś pomysły? Po sprawdzeniu, translate
że jest tam referencja API Honeycomb API . Co mnie ominęło?
Czy istnieje inny sposób animacji przejścia między fragmentami? Dziękuję Ci
android
android-3.0-honeycomb
Labeeb Panampullan
źródło
źródło
Odpowiedzi:
Musisz używać nowego
android.animation
frameworka (animatorów obiektów) zarówno z,FragmentTransaction.setCustomAnimations
jak iFragmentTransaction.setTransition
.Oto przykład użycia
setCustomAnimations
z FragmentHideShow.java ApiDemos :a oto odpowiedni animator XML z res / animator / fade_in.xml :
Zauważ, że możesz łączyć wielu animatorów za pomocą
<set>
, podobnie jak ze starszymi ramami animacji.EDYCJA : Ponieważ ludzie pytają o wsuwanie / wysuwanie, skomentuję to tutaj.
Wsuwane i wysuwane
Oczywiście można animować
translationX
,translationY
,x
orazy
właściwości, ale ogólnie slajdy obejmować animowanie zawartości do iz poza ekranem. O ile mi wiadomo, nie ma żadnych właściwości przejścia wykorzystujących wartości względne. Nie przeszkadza to jednak w pisaniu ich samemu. Pamiętaj, że animacje właściwości wymagają po prostu metod pobierających i ustawiających obiekty, które animujesz (w tym przypadku widoków), więc możesz po prostu stworzyć własnegetXFraction
isetXFraction
metody w podklasie widoku, takie jak:Teraz możesz animować właściwość „xFraction” w następujący sposób:
res / animator / slide_in.xml :
Zwróć uwagę, że jeśli obiekt, w którym animujesz, nie ma takiej samej szerokości jak jego obiekt nadrzędny, wszystko nie będzie wyglądać dobrze, więc może być konieczne dostosowanie implementacji właściwości w celu dopasowania do Twojego przypadku użycia.
źródło
Zrobiłem w ten sposób:
Dodaj tę metodę do wymiany fragmentów z animacji :
Musisz dodać cztery animacje do folderu anim, który jest powiązany z zasobem :
enter_from_left.xml :
exit_to_right.xml :
enter_from_right.xml :
exit_to_left.xml :
Wynik:
Gotowe .
źródło
.setCustomAnimations(R.anim.enter_from_right, R.anim.exit_to_left, R.anim.enter_from_left, R.anim.exit_to_right)
Jeśli możesz sobie pozwolić na przywiązanie do Lollipopa i później, wydaje się, że to załatwi sprawę:
Mam nadzieję że to pomoże.
źródło
new Slide(...)
: wywołanie wymaga interfejsu API poziomu 21Nurik „s odpowiedź była bardzo pomocna, ale nie mogę zmusić go do pracy, aż znalazłem to . Krótko mówiąc, jeśli używasz biblioteki kompatybilności (np. SupportFragmentManager zamiast FragmentManager), składnia plików animacji XML będzie inna.
źródło
Oto animacja wsuwania / wyjmowania między fragmentami:
Używamy objectAnimator.
Oto dwa pliki xml w podfolderze animatora .
enter_anim.xml
exit_anim.xml
Mam nadzieję, że to komuś pomoże.
źródło
.setCustomAnimations(R.animator.slide_in_left, R.animator.slide_out_right, R.animator.slide_in_left, R.animator.slide_out_right)
Dla każdego, kto zostanie złapany, upewnij się, że setCustomAnimations jest wywoływany przed wywołaniem w celu zastąpienia / dodania podczas budowania transakcji.
źródło
Implementacja FragmentTransaction dla systemu Android SDK potrzebuje
Animator
biblioteki wsparcia przez chwilęAnimation
, nie pytaj mnie dlaczego, ale po komentarzu Strangeluka zajrzałem do kodu Androida 4.0.3 i biblioteki wsparcia. Android SDK używaloadAnimator()
i obsługuje bibliotekę pomocnicząloadAnimation()
źródło
Spróbuj użyć tego prostego i szybkiego rozwiązania. Android oferuje niektóre domyślne
animation
.Wynik:
źródło