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.fade_in
android.R.anim.fade_out,
還有
android.R.anim.slide_in_left
android.R.anim.slide_out_right。
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切換動畫失效?!
Special Case:增加flags Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK導致Acitivity切換動畫失效?!
實作上發現,若是有增加CLEAR_TOP跟NEW_TASK的flag,則即使Theme裡面已經設定切換動畫了,還是不會呈現預期的效果。
此時可以使用第一種方法來設定動畫,也就是在startActivity後執行overridePendingTransition。
此時可以使用第一種方法來設定動畫,也就是在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。
留言
張貼留言