這邊就不介紹過渡動畫了,先上我的過渡動畫代碼,我寫的是進入的時候從下往上,退出的時候從上往下的動畫。
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();