fragment切換動畫

Fragment切換動畫


在Activity跳轉之間可以設置動畫效果,例如平移,漸變,旋轉等動畫,當然在Fragment中也可以設置切換的動畫效果,可以達到跟ViewPager切換動畫類似的效果。在Fragment中設置自定義切換動畫主要分爲了兩種情景,一種是使用 android.app.Fragment包裏面的Fragment類時,FragmentManager裏面的FragmentTransaction事務只支持XML中的animator標籤,如objectAnimator屬性動畫,不支持傳統的補間動畫標籤如<translate>,<alpha>等。 


另一種是使用兼容性版本的android.support.v4.app.Fragment包裏面的Fragment類,SupportFragmentManager裏面的FragmentTransaction事務支持XML中的animation標籤,也就是傳統的補間動畫,例如<translate>,<alpha>,不支持屬性動畫標籤。

設置Fragment的切換動畫主要是使用FragmentTransaction事務類的中setCustomAnimations方法:

setCustomAnimations 
FragmentTransaction setCustomAnimations (int enter, 
int exit, 
int popEnter, 
int popExit)

該方法有4個參數,第一個參數enter是指當一個Fragment被添加added 或者綁定attached到視圖上,該Fragment進入視圖時的animation或者animator的資源ID;第二個參數exit是指當一個Fragment從視圖上被移除removed或者解除綁定detached時,該Fragment移出視圖時的animation或者animator的資源ID;第三個參數popEnter是指當調用popBackStack()方法或者類似的方法彈出棧頂的Fragment後,Fragment棧的棧頂Fragment重新被添加readded或重新綁定reattached到視圖上時,該Fragment進入視圖時的animation或者animator的資源ID;第四個參數popExit是指當調用popBackStack()方法或者類似的方法彈出棧頂的Fragment時,該彈出的Fragment即從視圖上被移除removed或者解除綁定detached,該Fragment移出視圖時的animation或者animator的資源ID。

android.support.v4.app.Fragment包實現


要實現Fragment的自定義切換動畫效果,首先需要自定義XML動畫資源文件,可以在res文件夾下新建anim文件夾然後新建XML資源文件。由於android.support.v4.app.Fragment包只支持補間動畫的標籤,所以可以按照自己的想法來在根標籤set中新建動畫標籤來實現效果,如translate平移,alpha漸變透明度,rotate旋轉,scale縮放等。 


slide_left_in.xml 左視圖進入時動畫
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">

    <translate
        android:fromXDelta="-100%p"
        android:toXDelta="0%p"
        android:duration="@integer/card_flip_time_full"/>

    <alpha
        android:fromAlpha="0.5"
        android:toAlpha="1.0"
        android:duration="@integer/card_flip_time_full"/>

</set>

slide_left_out.xml 左視圖移出時動畫
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">

    <translate
        android:fromXDelta="0%p"
        android:toXDelta="-100%p"
        android:duration="@integer/card_flip_time_full"/>

    <alpha
        android:fromAlpha="1.0"
        android:toAlpha="0.5"
        android:duration="@integer/card_flip_time_full"/>

</set>

slide_right_in.xml 右視圖進入時動畫
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">

    <translate
        android:fromXDelta="100%p"
        android:toXDelta="0%p"
        android:duration="@integer/card_flip_time_full"/>

    <alpha
        android:fromAlpha="0.5"
        android:toAlpha="1.0"
        android:duration="@integer/card_flip_time_full"/>

</set>


slide_right_out.xml 右視圖移出時動畫
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">

    <translate
        android:fromXDelta="0%p"
        android:toXDelta="100%p"
        android:duration="@integer/card_flip_time_full"/>

    <alpha
        android:fromAlpha="1.0"
        android:toAlpha="0.5"
        android:duration="@integer/card_flip_time_full"/>

</set>

Activity中實現 
注意使用getSupport來獲取support.V4包裏面的代碼資源:
public class MainActivity extends BaseActivity {
    private FirstFragment firstFragment;
    private SecondFragment secondFragment;
    private Button previous;
    private Button next;

    @Override
    protected void initView() {
        setContentView(R.layout.activity_main);
        previous= (Button) findViewById(R.id.Btn_Previous);
        next= (Button) findViewById(R.id.Btn_Next);
    }

    @Override
    protected void initData() {
        firstFragment=new FirstFragment();
        secondFragment=new SecondFragment();
        getSupportFragmentManager()
                .beginTransaction()
                .add(R.id.Container,firstFragment)
                .commit();
    }

    @Override
    protected void initListener() {
        previous.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                getSupportFragmentManager()
                        .popBackStack();
            }
        });

        next.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                getSupportFragmentManager()
                        .beginTransaction()
                        .setCustomAnimations(
                                R.anim.slide_right_in,
                                R.anim.slide_left_out,
                                R.anim.slide_left_in,
                                R.anim.slide_right_out
                        ).replace(R.id.Container,secondFragment)
                        .addToBackStack(null)
                        .commit();
            }
        });
    }

}

android.app.Fragment包實現


android.app.Fragment包裏面的FragmentManager的Transaction事務只支持屬性動畫的資源標籤,所以可以在res文件夾中新建animator文件夾,然後在該animator中的根標籤set內新建<objectAnimator>標籤來實現動畫效果,objectAnimator標籤中可以指定propertyName來實現特定的動畫效果,如alpha漸變透明度,translateX X軸上的平移,rotationY Y軸上的旋轉等等。 

下面是繞Y軸旋轉的切換動畫


card_flip_left_in.xml 左視圖進入時動畫
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">

    <objectAnimator
        android:propertyName="rotationY"
        android:valueFrom="-180"
        android:valueTo="0"
        android:duration="@integer/card_flip_time_full"
        android:interpolator="@android:interpolator/accelerate_decelerate"/>

    <objectAnimator
        android:propertyName="alpha"
        android:valueFrom="0.0"
        android:valueTo="1.0"
        android:duration="1"
        android:startOffset="@integer/card_flip_time_half"/>
</set>

card_flip_left_out.xml 左視圖移出時動畫
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">

    <objectAnimator
        android:propertyName="rotationY"
        android:valueFrom="0"
        android:valueTo="-180"
        android:duration="@integer/card_flip_time_full"
        android:interpolator="@android:interpolator/accelerate_decelerate"/>

    <objectAnimator
        android:propertyName="alpha"
        android:valueFrom="1.0"
        android:valueTo="0.0"
        android:duration="1"
        android:startOffset="@integer/card_flip_time_half"/>

</set>

card_flip_right_in.xml 右視圖進入時動畫
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">


    <objectAnimator
        android:propertyName="rotationY"
        android:valueFrom="180"
        android:valueTo="0"
        android:duration="@integer/card_flip_time_full"
        android:interpolator="@android:interpolator/accelerate_decelerate"/>

    <objectAnimator
        android:propertyName="alpha"
        android:valueFrom="0.0"
        android:valueTo="1.0"
        android:duration="1"
        android:startOffset="@integer/card_flip_time_half"/>

</set>

card_flip_right_out.xml 右視圖移出時動畫
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">

    <objectAnimator
        android:propertyName="rotationY"
        android:valueFrom="0"
        android:valueTo="180"
        android:duration="@integer/card_flip_time_full"
        android:interpolator="@android:interpolator/accelerate_decelerate"/>

    <objectAnimator
        android:propertyName="alpha"
        android:valueFrom="1.0"
        android:valueTo="0.0"
        android:duration="1"
        android:startOffset="@integer/card_flip_time_half"/>

</set>

Activity中實現 
注意使用App包裏面的Fragment時,只能使用getFragmentManager來使用,不能使用V4包裏面的support組件:
public class MainActivity extends BaseActivity {
    private FirstFragment firstFragment;
    private SecondFragment secondFragment;
    private Button previous;
    private Button next;

    @Override
    protected void initView() {
        setContentView(R.layout.activity_main);
        previous= (Button) findViewById(R.id.Btn_Previous);
        next= (Button) findViewById(R.id.Btn_Next);
    }

    @Override
    protected void initData() {
        firstFragment=new FirstFragment();
        secondFragment=new SecondFragment();
        getFragmentManager()
                .beginTransaction()
                .add(R.id.Container,firstFragment)
                .commit();
    }

    @Override
    protected void initListener() {
        previous.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                getFragmentManager()
                        .popBackStack();
            }
        });

        next.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                getFragmentManager()
                        .beginTransaction()
                        .setCustomAnimations(
                                R.animator.card_flip_right_in,
                                R.animator.card_flip_left_out,
                                R.animator.card_flip_left_in,
                                R.animator.card_flip_right_out
                        ).replace(R.id.Container,secondFragment)
                        .addToBackStack(null)
                        .commit();
            }
        });
    }

}
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章