一. overridePendingTransition():
此方式只需要在啟動另一個activity和退出activity的時候調用就行,這個方法接收兩個參數,一個是新啟動的activity進入時的動畫春叫,另一個是當前activity消失時的動畫。
啟動:
startActivity(newIntent(MainActivity.this,TestActivityWithTheme.class));
overridePendingTransition(R.anim.open_in, R.anim.open_out);
退出:
@Override
public void finish() {
super.finish();
overridePendingTransition(R.anim.close_in, R.anim.close_out);
}
二. ActivityOptionsCompat:
這個類是supportv4中新加的一個類闪盔,可以為activity添加各種動畫效果违寞,這里面的api至少要求4.0以上的系統(tǒng),部分要求5.0以上契邀,谷歌為我們封裝好了的一些拉伸擴散動畫摆寄,共享元素動畫等等,下面只介紹一種簡單效果的實現方式坯门,
啟動:
ActivityOptionsCompat compat = ActivityOptionsCompat.makeCustomAnimation(MainActivity.this, R.anim.open_in, R.anim.open_out);
ActivityCompat.startActivity(MainActivity.this,intent, compat.toBundle());
退出:
Override
public void onBackPressed() {
super.onBackPressed();
ActivityCompat.finishAfterTransition(this);
}
注意:該退出方法不能達到預期的動畫效果椭迎,還需要使用第一種方式實現退出overridePendingTransition(R.anim.close_in, R.anim.close_out);
三.AppTheme: 直接在主題中修改activity動畫樣式:
我們可以在 AndroidManifest.xml 文件中,通過Android:theme 屬性設置 Activity 的主題田盈。主題中可以定義 Activity 的切換動畫。這是應用 Activity 切換動畫的一種方法缴阎。下面是通過主題來設置 Activity 間的切換動畫的實現方式允瞧。
3.1、定義包含動畫的 Activity 主題
res/values/styles.xml
<style name="AnimActivityTheme" parent="@android:style/Animation.Activity">
<item name="android:windowAnimationStyle">@style/MyWindowAnimTheme</item>
</style>
就是使用 windowAnimationStyle 這個屬性蛮拔,指定切換動畫的style即可述暂。
3.2、定義切換動畫 style
res/values/styles.xml
<style name="MyWindowAnimTheme">
<item name="android:activityOpenEnterAnimation">@anim/top_to_bottom_in</item>
<item name="android:activityOpenExitAnimation">@anim/top_to_bottom_out</item>
<item name="android:activityCloseEnterAnimation">@anim/bottom_to_top_in</item>
<item name="android:activityCloseExitAnimation">@anim/bottom_to_top_out</item>
</style>
下面具體介紹這4個屬性的意思建炫,假設我們有 2 個 Activity畦韭,分別是 A 和 B:
- A 啟動 B 時,A 從屏幕上消失肛跌,這時執(zhí)行的是A的
android:activityOpenExitAnimation - A 啟動 B 時艺配,B 出現在屏幕上,這時執(zhí)行的是B的
android:activityOpenEnterAnimation - 從 B 返回A時衍慎,B從屏幕上消失转唉,這時執(zhí)行的是B的
android:activityCloseExitAnimation - 從 B 返回A時,A 出現在屏幕上稳捆,這時執(zhí)行的是A的
android:activityCloseEnterAnimation
3.3赠法、定義具體動畫文件
- res/anmi/res/top_to_bottom_in.xml
- res/anmi/res/top_to_bottom_out.xml
- res/anmi/res/bottom_to_top_in.xml
- res/anmi/res/bottom_to_top_out.xml
這里不再介紹動畫文件的實現。
3.4乔夯、應用到對應 Activity
AndroidMenifest.xml
<activity android:name=".MainActivity"
android:theme="@style/AnimActivityTheme”>
3.5砖织、另外在使用AppTheme設置動畫時發(fā)現了兩個問題,
3.5.1末荐、添加動畫后侧纯,出現從黑屏到新activity的過度。
原因:沒有設置相應的消失動畫鞠评。
解決方法:設置相應的消失動畫茂蚓,如果不想設置消失動畫,可以使用寫一個假動畫,這個動畫是沒有任何效果聋涨,只是為了避免出現黑屏晾浴,運行效果為原acticity靜止不動,新啟動的activity執(zhí)行進入動畫牍白。
3.5.2脊凰、沒有動畫,或動畫與設置不一致
原因:當頁面切換時需要進入和消失兩個動畫茂腥,當沒有進入動畫時狸涌,消失動畫也不會執(zhí)行,會執(zhí)行系統(tǒng)動畫最岗,如果沒有系統(tǒng)動畫則沒有動畫帕胆,或者某個頁面使用第一或第二種方式設置了動畫(動畫執(zhí)行優(yōu)先級,系統(tǒng)動畫 < AppTheme < (overridePendingTransition\ActivityOptionsCompat))般渡。
解決方法:為了保證進入和消失都有動畫懒豹,要將動畫主題設置到兩個Activity上。也可以將主題設置到application上驯用,這樣整個應用都是用該切換動畫脸秽。如果是某個頁面使用第一或第二種方式設置了動畫,那么在啟動和退出時最好都要設置蝴乔,不然會造成啟動和退出不一致的情況记餐。
總結:
第一種方式:靈活可以隨意控進入消失動畫,但是實現不方便薇正。
第二種方式:與第一種方式類似片酝,但是該種方式為我們提供了多種特殊動畫。
第三種方式:使用方便挖腰,只需要配置主題钠怯,不需要添加過多代碼,但是不夠靈活
建議:
定義一種動畫主題曙聂,并設置到application上晦炊,將整個應用的切換動畫統(tǒng)一,如果某個頁面有特殊要求宁脊,再根據不用需求使用第一或第二種類型單獨處理断国。