zamień fragment w działaniu za pomocą animacji

94

Chcę zamienić dwa fragmenty w działaniu za pomocą animacji. Załóżmy, że Strona A jest dla frakcji A i lewa strona ekranu, a Strona B jest dla fragmentu B, tj. Po prawej stronie ekranu. Teraz chcę, aby po kliknięciu przycisku na stronie A strona A została przeniesiona na prawą stronę ekranu z animacją przejścia.

Wypróbowałem poniższy kod, aby zastąpić pozycję

FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.container, new FragB());
fragmentTransaction.commit();

Szukam jakiejś wskazówki.

Z góry dziękuję.

Deepak Goel
źródło
1
możliwy duplikat Animate przejścia między fragmentami
TalkLittle,

Odpowiedzi:

284

Stary questiion i prawdopodobnie już to rozgryzłeś, ale na przyszłość:

oto, czego używasz do ustawiania niestandardowej animacji, gdy zastępujesz fragment za pomocą kodu:

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();

ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right);
ft.replace(R.id.fragment_container, newFragment, "fragment");
// Start the animated transition.
ft.commit();

Oto przykład animacji slide_in_left:

<?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="500"/>
</set>

Zwróć uwagę, że jest to animacja, jeśli używasz biblioteki zgodności. Zamiast tego, jeśli używasz i SDK z natywną obsługą FragmentManager, Twoja animacja będzie wyglądać następująco:

<?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>

Dzieje się tak, ponieważ biblioteka zgodności nie obsługuje nowego typu objectAnimator i zamiast tego implementuje tylko starą strukturę animacji.

sciutand
źródło
92
To zdecydowanie właściwa odpowiedź. Pamiętaj, że kolejność ma znaczenie! Musisz mieć wywołanie setCustomAnimations () przed wywołaniami add / replace!
theelfismike
2
Więc które podejście należy zastosować, jeśli chcesz mieć najlepszą kompozycję?
basickarl
17
Te różne animacje nie są dokładnie równe. Zakładasz, że szerokość twojego fragmentu jest równa 1280, używając wartości Od -1280. Jeśli szerokość byłaby większa, nie uruchomi się całkowicie poza ekranem.
egfconnor
53
Zamiast tego można użyć predefiniowanych animacji z przestrzeni nazw Androida: transaction.setCustomAnimations (android.R.anim.slide_in_left, android.R.anim.slide_out_right);
Jordy
2
Predefiniowane animacje wyzwalają wyjątek czasu wykonywania, FWIW, ponieważ opierają się na tagu „translate”.