天天看點

Android 自定義activity切換動畫實作,overridePendingTransition的使用詳解

相信大家在開發的過程中都會寫一個SplashActivity用來進行預先加載資料,加載資料完成後跳轉至主界面,但是android預設的activity切換是向左滑動,這樣我個人認為不夠好看。就比如我最喜歡的APP網易雲音樂,在SplashActivity結束後的跳轉就是用的收縮動畫。

其實關于實作這樣的方法已經有很多人實作了,但是有些在使用的時候我發現根本不夠全面,因為我以後在很多地方都會用到,就記在這裡了,算是加深自己的記憶。畢竟自己已經很久沒有更新部落格了~下面呢算是我的一個總結,使用過程中遇到的一些坑~

衆所周知,Activity的切換動畫指的是從一個activity跳轉到另外一個activity時的動畫,在Android的2.0版本之後,Java單獨提供了一個方法overridePendingTransition。我們檢視一下這個方法裡面的實作代碼:

public void overridePendingTransition(int enterAnim, int exitAnim) {
        try {
            ActivityManagerNative.getDefault().overridePendingTransition(
                    mToken, getPackageName(), enterAnim, exitAnim);
        } catch (RemoteException e) {
        }
    }
           

我們可以看到第一個參數是enterAnim ,第二個參數是exitAnima,根據名字我們可以知道,如果我們要從界面1調到界面2,參數一對應的是界面2的進入動畫,參數二對應的是界面1的退出動畫。

看一下我簡單實作的代碼:

new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                Intent mIntent = new Intent();
                if(UserConstant.IsLogin){
                    mIntent.setClass(SplashActivity.this,MainActivity.class);
                }else{
                    mIntent.setClass(SplashActivity.this,LoginActivity.class);
                }
                startActivity(mIntent);
                finish();
                overridePendingTransition(R.anim.fade_in, R.anim.fade_out);
            }
        },1000);
           

淡入動畫fade_in.xml的代碼:

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- fromAlpha:開始時透明度,當為1的時候表示不透明,為0的時候表示全透明;toAlpha:結束時透明度;duration:動畫持續時間 -->

    <alpha
        android:duration="@android:integer/config_longAnimTime"
        android:fromAlpha="0.0"
        android:toAlpha="1.0" />
</set>
           

淡出動畫fade_out.xml的代碼:

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <alpha
        android:duration="@android:integer/config_longAnimTime"
        android:fromAlpha="1.0"
        android:toAlpha="0.0" />
</set>
           

其中fromAlph和toAlph的值一定要搞清楚,千萬不要弄反了,不然會出現閃屏  ,不要問我為什麼知道...生無絕戀臉(╥╯﹏╰╥)ง

注意 :   關于使用overridePendingTransition,需要注意以下幾點:

1、在startActivity(intent)之後使用時,enterAnim在exitAnim上層(圖層的上一層)執行(即進入的動畫在上層),此時可以沒有exitAnim,但是一定要有enterAnim,如果enterAnim傳0或者無效的動畫資源的話,進入時沒有動畫效果,新頁面會在一瞬間覆寫螢幕,是以exitAnim不會被看見,即使它執行了,你也絲毫看不見。

2、在finish()之後使用時,enterAnim在exitAnim下層執行(出去的動畫在上層),此時可以沒有enterAnim,但是一定要有exitAnim,道理同上。否則的話,要麼動畫很醜(頁面突然消失,閃黑),要麼下層執行的動畫被擋住看不見,感覺不到動畫效果。

3、overridePendingTransition需要在主線程中有效,子線程無效,如果必須實在子線程用可以Handler、message的方式。我最開始先在timeTask中使用,結果沒效果,一定要注意咯~

就是以上這些了,希望能夠幫到你~