1. 程式人生 > >Fragment 實現動畫效果

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:interpolator="@android:interpolator/accelerate_decelerate" 
    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依次發生。

  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <setxmlns:android="http://schemas.android.com/apk/res/android">
  3.         <objectAnimatorandroid:interpolator="@android:interpolator/accelerate_cubic"
  4.             android:valueFrom="1"
  5.             android:valueTo="0"
  6.             android:valueType="floatType"
  7.             android:propertyName="alpha"
  8.             android:duration="1000"/>
  9.         <objectAnimatorandroid:interpolator="@android:interpolator/accelerate_cubic"
  10.             android:valueFrom="0"
  11.             android:valueTo="1280"
  12.             android:valueType="floatType"
  13.             android:propertyName="Y"
  14.             android:duration="1000"/>
  15. </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。