android:activity過渡動畫 finish 關閉activity 無效

這邊就不介紹過渡動畫了,先上我的過渡動畫代碼,我寫的是進入的時候從下往上,退出的時候從上往下的動畫。

transition文件夾兩個:

bottom_ani.xml 退出動畫

<?xml version="1.0" encoding="utf-8"?>
<slide xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:interpolator/decelerate_cubic"
    android:slideEdge="top">

</slide>

top_ani.xml 進入動畫

<?xml version="1.0" encoding="utf-8"?>
<slide xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:interpolator/decelerate_cubic"
    android:slideEdge="bottom"/>

然後在activity的setContentView之前設置這兩個動畫:

getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
        Transition top = TransitionInflater.from(this).inflateTransition(R.transition.top_ani);
        getWindow().setEnterTransition(top);
        Transition bottom = TransitionInflater.from(this).inflateTransition(R.transition.bottom_ani);
        getWindow().setExitTransition(bottom);

啓動的時候使用:

startActivity(intent,ActivityOptions.makeSceneTransitionAnimation(EventSearchActivity.this).toBundle());

但是我結束的時候,直接使用了

finish();

退出動畫卻沒有成功顯示,從startActivity看,比正常的多了參數,那結束activity應該也不會是正常的finish()。

點擊手機上的返回鍵,退出動畫就顯示了,看看源碼:

@Override
    public void onBackPressed() {
        FragmentManager fragmentManager = mFragments.getSupportFragmentManager();
        final boolean isStateSaved = fragmentManager.isStateSaved();
        if (isStateSaved && Build.VERSION.SDK_INT <= Build.VERSION_CODES.N_MR1) {
            // Older versions will throw an exception from the framework
            // FragmentManager.popBackStackImmediate(), so we'll just
            // return here. The Activity is likely already on its way out
            // since the fragmentManager has already been saved.
            return;
        }
        // 我用的AppCompatActivity繼承的是FragmentActivity,所以上面有對於當退出時對於Fragment的操作,和動畫沒有關係,看下面,繼續點到父類的onBackPressed
        
        if (isStateSaved || !fragmentManager.popBackStackImmediate()) {
            super.onBackPressed();
        }
    }

點super.onBackPressed,就到Activity類了:

public void onBackPressed() {
        if (mActionBar != null && mActionBar.collapseActionView()) {
            return;
        }

        FragmentManager fragmentManager = mFragments.getFragmentManager();

        if (fragmentManager.isStateSaved() || !fragmentManager.popBackStackImmediate()) {
            //下面這句話,很明顯就是,啓動退出動畫再退出activity
            finishAfterTransition();
        }
    }

因此,把   finish();  替換成   finishAfterTransition();

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