[Android] 切換Activity時 以及 UI元件出現時的動畫設定

1. 切換Activity時設定動畫 (Animation when switching activities)


通常大家都會使用intent,接著執行startActivity來切換前景的Acitivity。
像這樣:


Intent intent = new Intent(this, A.class);         startActivity(intent);


一般切換的時候,效果是套用Android預設的動畫,
你知道其實可以自己設定動畫嗎?

方法很簡單,只要在startActivity後增加一行程式碼:

Intent intent = new Intent(this, A.class); 
startActivity(intent);
overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);

使用overridePendingTransition函數,可以設定進入、離開Activity時的動畫

而Android本身也有內建一些可使用的動畫選項,
除了上面例子的
android.R.anim.fade_in
android.R.anim.fade_out,
還有
android.R.anim.slide_in_left
android.R.anim.slide_out_right

OK,每次startActivity就加一行程式碼很簡單,
可是如果我需要頻繁切換呢....
動輒幾十個Activity的Project應該很常見吧!

懶人法:設定res/values/style裡主題的屬性。


首先新增一個內含Activity切換的style

<style name="AnimationActivity" parent="@android:style/Animation.Activity">
    <item name="android:activityOpenEnterAnimation"> @android:anim/fade_in</item>
    <item name="android:activityOpenExitAnimation"> @android:anim/fade_out</item>
    <item name="android:activityCloseEnterAnimation"> @android:anim/fade_in</item>
    <item name="android:activityCloseExitAnimation"> @android:anim/fade_out</item>
</style>

style name可以取自己的名字,重點是設定activity animation屬性。

最後將這個切換動畫的style設定在自己的theme裡面,設定的屬性是android:windowAnimationStyle

<style name="MyTheme" parent="@android:style/ Theme.DeviceDefault.Light">
    <!-- Some other items in your theme-->
    <item name="android:actionOverflowButtonStyle"> @android:style/Widget.DeviceDefault.ActionButton.Overflow</item>
    <!-- Set animation style-->
    <item name="android:windowAnimationStyle"> @style/AnimationActivity</item>
</style>

燈燈,現在每一個套用此主題的Activity都具有相同的切換動畫囉!


Special Case:增加flags Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK導致Acitivity切換動畫失效?!


實作上發現,若是有增加CLEAR_TOP跟NEW_TASK的flag,則即使Theme裡面已經設定切換動畫了,還是不會呈現預期的效果。
此時可以使用第一種方法來設定動畫,也就是在startActivity後執行overridePendingTransition。


2. UI元件出現時設定動畫 (Animation when UI component appears)


設定好淡入淡出之後,發現其他元件也要淡入淡出才有主題一致性,例如AlertDialog就是很常用的UI元件例子,該怎麼做呢?

首先在res/values/style.xml設定你想要的動畫,這邊一樣以淡入淡出為例:

<style name="FadeInOutAnimation">
    <item name="android:windowEnterAnimation"> @android:anim/fade_in</item>
    <item name="android:windowExitAnimation"> @android:anim/fade_out</item>
</style>

接著在AlertDialog設定動畫

alertdialog.getWindow().setWindowAnimations(R.style.FadeInOutAnimation);

主要就是先對UI元件呼叫getWindow(),接著setWindowAnimation,就大功告成囉

這邊要注意一下,不是用在AlertDialog.Builder喔,是AlertDialog元件才能getWindow。



留言