Fragment 實現動畫效果
利用fragment transaction進行切換,很方便提供切換的效果。
利用setTransition()
通過setTransition()我們可以設定有限幾個切換效果,程式碼如下:
protected void addFragmentToStack(int index){
DetailFragment detail = DetailFragment.newInstance(index);
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.replace(R.id.details, detail);
ft.addToBackStack("detail");
ft.commit();
}
程式碼設定的fade(漸變)效果。
利用setCustomAnimations()
通過ObjectAnimator自定義動態效果
在res/animator中設定兩個動態效果,slide_in_left.xml如下。
<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:valueFrom="-1280"
android:valueTo="0"
android:valueType="floatType"
android:propertyName="X"
android:duration="2000" />
實現自定義動畫的類是ObjectAnimator,不僅用於fragment,也可用於view。在xml中,定義了從“from”狀態到“to”狀態,時間間隔為duration(毫秒),所執行的變化規則稱為interpolator。最簡單的interpolator是linear,即@android:interpolator/linear,從狀態From到to狀態是均勻變化。預設的interpolator是accelerate_decelerate,如本例,在狀態變化中先是加速,後是減速,使使用者視覺上平滑過渡。此外還有@android:interpolator/bounce為彈跳方式。系統提供的方式可以在原始碼/data/res/interpolator中檢視。android:propertyName用於動畫的維度,在本例中X表示橫向,根view的setX()中的引數是float,所以設定valueType為floatType。我們設定可以設定自己的維度。From設定為-1280,因為這個值對於終端裝置而言,-1280個畫素位可以確保從不可視的位置移入。如果我們沒有設定From,系統會根據當前值來設定初始值。
另一個動態效果檔案slide_out_right.xml如下:
<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:interpolator/accelerate_decelerate"
android:valueFrom="0"
android:valueTo="1280"
android:valueType="floatType"
android:propertyName="X"
android:duration="2000" />
在看看其他動態效果。如要設定淡入淡出,維度是物件的透明度,即android:propertyName="alpha",淡入是from(0,不可視)到to(1),淡出是from(1)到to(0)。object animator會找到fragment的root view,然後不斷地呼叫setAlpha()方法,來改變透明度,呼叫的頻率和改變的值由interpolator來決定。
如果我們要在兩個或者兩個以上的維度設定變化,可以使用set tag,對應為Android的AnimatorSet類,下面的例子同時設定向下和淡出效果。set有一個屬性android:ordering,預設為together,即各個維度的變化同時發生,還可以設定為sequentially依次發生。
- <?xmlversion="1.0"encoding="utf-8"?>
- <setxmlns:android="http://schemas.android.com/apk/res/android">
- <objectAnimatorandroid:interpolator="@android:interpolator/accelerate_cubic"
- android:valueFrom="1"
- android:valueTo="0"
- android:valueType="floatType"
- android:propertyName="alpha"
- android:duration="1000"/>
- <objectAnimatorandroid:interpolator="@android:interpolator/accelerate_cubic"
- android:valueFrom="0"
- android:valueTo="1280"
- android:valueType="floatType"
- android:propertyName="Y"
- android:duration="1000"/>
- </set>
程式程式碼的編寫
程式碼如下:
protected void addFragmentToStack(int index){
DetailFragment detail = DetailFragment.newInstance(index);
FragmentTransaction ft = getFragmentManager().beginTransaction();
//setCustomAnimations()必須位於replace()之前,否則效果不起所中。它的兩個引數分別為enter,exit的效果。系統目前提供兩個效果,分別為android.R.animator.fade_in和android.R.animator.fade_out
ft.setCustomAnimations(R.animator.slide_in_left,R.animator.slide_out_right);
ft.addToBackStack("detail");
ft.replace(R.id.details,"detail");
ft.commit();
}
注意,進入和退出的兩個操作是同時進行的,並非先執行完exit再執行enter。