2012-01-16 54 views
74

我想通過動畫交換活動中的兩個片段。假設PageA是用於片段A並且左側在屏幕上而PageB是用於片段B,即在屏幕的右側。現在,當我點擊pageA上的一個按鈕時,PageA將會用一些過渡動畫移動到屏幕的右側。通過動畫在活動中交換片段

我嘗試下面的代碼替換位置

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

尋找一些線索。

在此先感謝。

+1

[Animate the fragments between transition]的可能重複(http://stackoverflow.com/questions/4932462/animate-the-transition-between-fragments) – TalkLittle 2014-07-09 20:57:43

回答

247

老questiion,你可能已經想通了,但是對於未來的參考:

這裏是你用什麼來設置自定義動畫,當你通過代碼替換片段:

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

這裏是一個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> 

請注意,如果您正在使用兼容性庫,則爲動畫。相反,如果你正在使用和SDK與該FragmentManager的原生支持,然後你的動畫看起來就像這樣:

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

這是因爲兼容性庫不支持新的objectAnimator類型,而是隻實現舊的動畫框架。

+79

這絕對是正確的答案。請注意訂單很重要!您需要在添加/替換調用之前進行setCustomAnimations()調用! – theelfismike 2013-04-10 23:19:51

+2

那麼你應該使用哪種方法? – 2013-09-24 16:53:25

+17

這些不同的動畫並不完全相同。你假設你的片段的寬度等於1280通過使用-1280的值。如果寬度更大,則不會從屏幕完全開始。 – egfconnor 2013-11-05 22:23:24