全屏window、Activity默認動畫
<resources>
<style name="AppTheme" parent="Theme.XXXX">
<item name="android:windowAnimationStyle">@style/Animation.Activity</item>
</style>
<style name="Animation.Activity">
<item name="activityOpenEnterAnimation">@anim/activity_open_enter</item>
<item name="activityOpenExitAnimation">@anim/activity_open_exit</item>
<item name="activityCloseEnterAnimation">@anim/activity_close_enter</item>
<item name="activityCloseExitAnimation">@anim/activity_close_exit</item>
<item name="taskOpenEnterAnimation">@anim/task_open_enter</item>
<item name="taskOpenExitAnimation">@anim/task_open_exit</item>
<item name="launchTaskBehindTargetAnimation">@anim/launch_task_behind_target</item>
<item name="launchTaskBehindSourceAnimation">@anim/launch_task_behind_source</item>
<item name="taskCloseEnterAnimation">@anim/task_close_enter</item>
<item name="taskCloseExitAnimation">@anim/task_close_exit</item>
<item name="taskToFrontEnterAnimation">@anim/task_open_enter</item>
<item name="taskToFrontExitAnimation">@anim/task_open_exit</item>
<item name="taskToBackEnterAnimation">@anim/task_close_enter</item>
<item name="taskToBackExitAnimation">@anim/task_close_exit</item>
<item name="wallpaperOpenEnterAnimation">@anim/wallpaper_open_enter</item>
<item name="wallpaperOpenExitAnimation">@anim/wallpaper_open_exit</item>
<item name="wallpaperCloseEnterAnimation">@anim/wallpaper_close_enter</item>
<item name="wallpaperCloseExitAnimation">@anim/wallpaper_close_exit</item>
<item name="wallpaperIntraOpenEnterAnimation">@anim/wallpaper_intra_open_enter</item>
<item name="wallpaperIntraOpenExitAnimation">@anim/wallpaper_intra_open_exit</item>
<item name="wallpaperIntraCloseEnterAnimation">@anim/wallpaper_intra_close_enter</item>
<item name="wallpaperIntraCloseExitAnimation">@anim/wallpaper_intra_close_exit</item>
<item name="fragmentOpenEnterAnimation">@animator/fragment_open_enter</item>
<item name="fragmentOpenExitAnimation">@animator/fragment_open_exit</item>
<item name="fragmentCloseEnterAnimation">@animator/fragment_close_enter</item>
<item name="fragmentCloseExitAnimation">@animator/fragment_close_exit</item>
<item name="fragmentFadeEnterAnimation">@animator/fragment_fade_enter</item>
<item name="fragmentFadeExitAnimation">@animator/fragment_fade_exit</item>
</style>
</resources>
非全屏window、Activity默認動畫
<style name="AppTheme" parent="Theme.XXXX">
<item name="android:windowAnimationStyle">@style/Animation.Dialog</item>
</style>
<style name="Animation.Dialog">
<item name="windowEnterAnimation">@anim/dialog_enter</item>
<item name="windowExitAnimation">@anim/dialog_exit</item>
</style>
...等等 參考android/frameworks/base/core/res/res/values/styles.xml
Transition中默認動畫
<resources>
<style name="AppTheme" parent="Theme.XXXX">
<item name="windowContentTransitions">false</item>
<item name="windowActivityTransitions">true</item>
<item name="windowEnterTransition">@transition/fade</item>
<item name="windowExitTransition">@transition/slide_bottom</item>//這個不是默認的
<item name="windowSharedElementEnterTransition">@transition/move</item>
<item name="windowSharedElementExitTransition">@transition/move</item>
<item name="windowAllowEnterTransitionOverlap">true</item>
<item name="windowAllowReturnTransitionOverlap">true</item>
</style>
</resources>
生效時機,及overridePendingTransition影響範圍
Android7.0 (Pixel XL API24 x86_64)
1、同一Task,以下四個動畫生效
activityOpenEnterAnimation/activityOpenExitAnimation
activityCloseEnterAnimation/activityCloseExitAnimation
例如:
Activity1啓動Activity2
Acivity1使用Activity2的styles.xml中聲明的activityOpenExitAnimation
Acivity2使用Activity2的styles.xml中聲明的activityOpenEnterAnimation
Activity2返回Activity1
Acivity1使用Activity1的styles.xml中聲明的activityCloseEnterAnimation
Acivity2使用Activity1的styles.xml中聲明的activityCloseExitAnimation
2、不同Task(設置了SingleInstance或兩個應用),以下四個動畫生效
taskOpenEnterAnimation/taskOpenExitAnimation
taskCloseEnterAnimation/taskCloseExitAnimation
例如:
應用1的Activity1啓動應用2的Activity2
Acivity1使用Activity2的styles.xml中聲明的taskOpenExitAnimation
Acivity2使用Activity2的styles.xml中聲明的taskOpenEnterAnimation
應用2的Activity2返回應用1的Activity1
Acivity1使用Activity1的styles.xml中聲明的taskCloseEnterAnimation
Acivity2使用Activity1的styles.xml中聲明的taskCloseExitAnimation
3、不同Task,當Task被move到頂層或底層時{例如:重寫finish(),在finish()方法中調moveTaskToBack(true)
},以下四個動畫生效
taskToFrontEnterAnimation/taskToFrontExitAnimation
taskToBackEnterAnimation/taskToBackExitAnimation
例如:
Activity2設置了啓動模式爲SingleInstance
Activity1啓動Activity2
Acivity1使用Activity2的styles.xml中聲明的taskToFrontExitAnimation
Acivity2使用Activity2的styles.xml中聲明的taskToFrontEnterAnimation
Activity2返回Activity1
Acivity1使用Activity1的styles.xml中聲明的taskToBackEnterAnimation
Acivity2使用Activity1的styles.xml中聲明的taskToBackExitAnimation
4、當Activity設置了<item name="android:windowShowWallpaper">true</item>
(1、2、3)中的動畫將不生效,以下八個動畫生效
wallpaperOpenEnterAnimation/wallpaperOpenExitAnimation
wallpaperCloseEnterAnimation/wallpaperCloseExitAnimation
wallpaperIntraOpenEnterAnimation/wallpaperIntraOpenEnterAnimation
wallpaperIntraCloseEnterAnimation/wallpaperIntraCloseExitAnimation
例如:
情景1:Activity1設置了<item name="android:windowShowWallpaper">true</item>
Activity1啓動Activity2
Acivity1使用Activity2的styles.xml中聲明的wallpaperCloseExitAnimation
Acivity2使用Activity2的styles.xml中聲明的wallpaperCloseEnterAnimation
Activity2返回Activity1
Acivity1使用Activity1的styles.xml中聲明的wallpaperOpenEnterAnimation
Acivity2使用Activity1的styles.xml中聲明的wallpaperOpenExitAnimation
情景2:Activity2設置了<item name="android:windowShowWallpaper">true</item>
Activity1啓動Activity2
Acivity1使用Activity2的styles.xml中聲明的wallpaperOpenExitAnimation
Acivity2使用Activity2的styles.xml中聲明的wallpaperOpenEnterAnimation
Activity2返回Activity1
Acivity1使用Activity1的styles.xml中聲明的wallpaperCloseEnterAnimation
Acivity2使用Activity1的styles.xml中聲明的wallpaperCloseExitAnimation
情景3:Activity1、Activity2同時設置了<item name="android:windowShowWallpaper">true</item>
Activity1啓動Activity2
Acivity1使用Activity2的styles.xml中聲明的wallpaperIntraOpenExitAnimation
Acivity2使用Activity2的styles.xml中聲明的wallpaperIntraOpenEnterAnimation
Activity2返回Activity1
Acivity1使用Activity1的styles.xml中聲明的wallpaperIntraCloseEnterAnimation
Acivity2使用Activity1的styles.xml中聲明的wallpaperIntraCloseExitAnimation
5、overridePendingTransition(int enterAnim, int exitAnim);
會覆蓋掉以上(1、2、3、4)通過windowAnimationStyle聲明的動畫,
但無法覆蓋5.0後的Transition{startActivity(intent, options.toBundle())};
6、遺留問題:FallbackHome啓動launcher時,launcher的動畫wallpaperCloseEnterAnimation去不掉
,只能用overridePendingTransition(0, 0);原因不明
附錄 SingleTask與SingleInstance
SingleTask:標註的Activity在被自身的app調用時,不新建task。當已存在的SingleTask界面被切換到前臺時,
SingleTask界面之後開啓的其他界面會被關閉
SingleInstance:新建task