Android Activity和Fragment的轉場動畫

Android Activity和Fragment的轉場動畫

 

Activity轉場動畫

  Activity的轉場動畫是經過overridePendingTransition(int enterAnim, int exitAnim)實現的。html

  這個方法是API Level 5 加入的。android

  這個方法在startActivity(Intent) or finish()以後被調用,指定接下來的這個轉場動畫。git

  方法的第一個參數:enterAnim,是新的Activity的進入動畫的resource ID;github

  第二個參數exitAnim,是舊的Activity(當前的Activity)離開動畫的resource ID。app

  因此這兩個參數的對象是兩個Activity。  ide

  若是上面兩個參數沒有動畫要設置,則用0做爲參數。學習

 

  動畫的資源文件放在res\anim\目錄下,是View Animation動畫

  參見本博客博文:Android Animation學習(六) View Animation介紹ui

 

  View Animation包含了基本的動畫類型,基本能夠知足通常轉場動畫的須要。this

  根節點能夠是:<alpha>, <scale>, <translate>, <rotate>, interpolator element, 或者是<set>

  利用set能夠進行各類嵌套組合。

  代碼例子:

Intent intent = new Intent(TestActivities.this,TestActivityFirst.class);
startActivity(intent);
// transaction animation
overridePendingTransition(R.anim.slide_in_bottom,R.anim.slide_out_bottom);

  其中兩個動畫:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromYDelta="100%p" android:toYDelta="0"
            android:duration="2000"/>
    <alpha android:fromAlpha="0.0" android:toAlpha="1.0"
            android:duration="2000" />
</set>
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromYDelta="0%p" android:toYDelta="100%p"
            android:duration="2000"/>
    <alpha android:fromAlpha="1.0" android:toAlpha="0.0"
            android:duration="2000" />
</set>

 

 

Fragment轉場動畫

  Fragment的轉場動畫實現分爲使用v4包和不使用v4包兩種狀況,不使用v4包的話,最低API Level須要是11

標準轉場動畫:

  能夠給Fragment指定標準的轉場動畫,經過setTransition(int transit)方法。

  該方法可傳入的三個參數是:

  TRANSIT_NONE,

  TRANSIT_FRAGMENT_OPEN,

  TRANSIT_FRAGMENT_CLOSE

  分別對應無動畫、打開形式的動畫和關閉形式的動畫。

  標準動畫設置好後,在Fragment添加和移除的時候都會有。

自定義轉場動畫

  自定義轉場動畫是經過setCustomAnimations()方法,由於Fragment添加時能夠指定加入到Back Stack中,因此轉場動畫有添加、移除、從Back stack中pop出來,還有進入四種狀況。

  注意setCustomAnimations()方法必須在add、remove、replace調用以前被設置,不然不起做用。

 

android.app.Fragment

  類參考:

  Fragment:http://developer.android.com/reference/android/app/Fragment.html

  FragmentTransaction:http://developer.android.com/reference/android/app/FragmentTransaction.html

 

  不使用v4包的狀況下(min API >=11)所對應的動畫類型是Property Animation

  即動畫資源文件須要放在res\animator\目錄下,且根標籤是<set>, <objectAnimator>, or <valueAnimator>三者之一。

  這一點也能夠從Fragment中的這個方法看出:onCreateAnimator(int transit, boolean enter, int nextAnim),返回值是Animator

  自定義轉場動畫時,四個參數的形式setCustomAnimations (int enter, int exit, int popEnter, int popExit)是API Level 13纔有的,11只引入了兩個動畫的形式,即沒法指定Back Stack棧操做時的轉場動畫。

  代碼例子:

    private void addFragment() {
        if (null == mFragmentManager) {
            mFragmentManager = getFragmentManager();
        }

        mTextFragmentOne = new MyFragmentOne();
        FragmentTransaction fragmentTransaction = mFragmentManager
                .beginTransaction();

        // 標準動畫
        // fragmentTransaction
        // .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
        // fragmentTransaction
        // .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);

        // fragmentTransaction
        // .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE);

        // 自定義動畫

        // API LEVEL 11
        fragmentTransaction.setCustomAnimations(
                R.animator.fragment_slide_left_enter,
                R.animator.fragment_slide_right_exit);

        // API LEVEL 13
        // fragmentTransaction.setCustomAnimations(
        // R.animator.fragment_slide_left_enter,
        // R.animator.fragment_slide_left_exit,
        // R.animator.fragment_slide_right_enter,
        // R.animator.fragment_slide_right_exit);

        fragmentTransaction.add(R.id.container, mTextFragmentOne);

        // 加入到BackStack中
        fragmentTransaction.addToBackStack(null);
        fragmentTransaction.commit();

    }

  其中四個動畫是從ApiDemos中拿來的:

fragment_slide_left_enter:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <objectAnimator
        android:interpolator="@android:interpolator/decelerate_quint"
        android:valueFrom="100dp" android:valueTo="0dp"
        android:valueType="floatType"
        android:propertyName="translationX"
        android:duration="@android:integer/config_mediumAnimTime" />
    <objectAnimator
        android:interpolator="@android:interpolator/decelerate_quint"
        android:valueFrom="0.0" android:valueTo="1.0"
        android:valueType="floatType"
        android:propertyName="alpha"
        android:duration="@android:integer/config_mediumAnimTime" />
</set>

fragment_slide_left_exit:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <objectAnimator
        android:interpolator="@android:interpolator/decelerate_quint"
        android:valueFrom="0dp" android:valueTo="-100dp"
        android:valueType="floatType"
        android:propertyName="translationX"
        android:duration="@android:integer/config_mediumAnimTime" />
    <objectAnimator
        android:interpolator="@android:interpolator/decelerate_quint"
        android:valueFrom="1.0" android:valueTo="0.0"
        android:valueType="floatType"
        android:propertyName="alpha"
        android:duration="@android:integer/config_mediumAnimTime" />
</set>

 

fragment_slide_right_enter:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <objectAnimator
        android:interpolator="@android:interpolator/decelerate_quint"
        android:valueFrom="-100dp" android:valueTo="0dp"
        android:valueType="floatType"
        android:propertyName="translationX"
        android:duration="@android:integer/config_mediumAnimTime" />
    <objectAnimator
        android:interpolator="@android:interpolator/decelerate_quint"
        android:valueFrom="0.0" android:valueTo="1.0"
        android:valueType="floatType"
        android:propertyName="alpha"
        android:duration="@android:integer/config_mediumAnimTime" />
</set>

fragment_slide_right_exit:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <objectAnimator
        android:interpolator="@android:interpolator/decelerate_quint"
        android:valueFrom="0dp" android:valueTo="100dp"
        android:valueType="floatType"
        android:propertyName="translationX"
        android:duration="@android:integer/config_mediumAnimTime" />
    <objectAnimator
        android:interpolator="@android:interpolator/decelerate_quint"
        android:valueFrom="1.0" android:valueTo="0.0"
        android:valueType="floatType"
        android:propertyName="alpha"
        android:duration="@android:integer/config_mediumAnimTime" />
</set>

 

android.support.v4.app.Fragment

  Fragment:http://developer.android.com/reference/android/support/v4/app/Fragment.html

  FragmentTransaction:http://developer.android.com/reference/android/support/v4/app/FragmentTransaction.html

 

  使用v4包,Fragment的使用再也不侷限於API Level 11之上,低等級的API也可使用,可是這時候轉場動畫的類型是View Animation

  動畫資源放在res\anim\路徑下,和Activity的轉場動畫同樣。

  Fragment中的方法:onCreateAnimation(int transit, boolean enter, int nextAnim)返回值Animation

 

  FragmentTransaction中的setCustomAnimations()方法,兩參數類型和四參數類型均可用。

  因此通常仍是用v4包的這個版本,一是兼容性比較好,另外View Animation其實基本能夠知足轉場動畫的須要。

 

  代碼例子:

    private void addFragment() {
        if (null == mFragmentManager) {
            mFragmentManager = getSupportFragmentManager();
        }

        mTextFragmentOne = new MyFragmentOne();
        FragmentTransaction fragmentTransaction = mFragmentManager
                .beginTransaction();
        fragmentTransaction.setCustomAnimations(
                R.anim.push_left_in,
                R.anim.push_left_out,
                R.anim.push_left_in,
                R.anim.push_left_out);

        fragmentTransaction.add(R.id.container, mTextFragmentOne);

        fragmentTransaction.addToBackStack(null);
        fragmentTransaction.commit();
    }

 

Demo:

  完整的例子項目:https://github.com/mengdd/HelloTransactionAnimations

相關文章
相關標籤/搜索