overridePendingTransition(R.anim.alpha_rotate, R.anim.my_alpha_action); android
若是要定義統一的風格的進入動畫,而且還要有退出的動畫,在每一個activity裏實現overridePendingTransition是很麻煩的 app
咱們能夠定義一個style主題的形式 ide
一個 anim_enter.xml 函數
<?xml version="1.0" encoding="UTF-8"?> <set android:interpolator="@android:anim/decelerate_interpolator" xmlns:android="http://schemas.android.com/apk/res/android"> <scale android:duration="@android:integer/config_mediumAnimTime" android:pivotX="69.99999%" android:pivotY="100.0%" android:fromXScale="0.0" android:toXScale="1.0" android:fromYScale="0.0" android:toYScale="1.0" /> <alpha android:duration="@android:integer/config_mediumAnimTime" android:fromAlpha="0.0" android:toAlpha="1.0" /> </set>
anim_exit.xml 動畫
<?xml version="1.0" encoding="UTF-8"?> <set android:interpolator="@android:anim/accelerate_interpolator" xmlns:android="http://schemas.android.com/apk/res/android"> <scale android:duration="@android:integer/config_mediumAnimTime" android:pivotX="69.99999%" android:pivotY="100.0%" android:fromXScale="1.0" android:toXScale="0.0" android:fromYScale="1.0" android:toYScale="0.0" /> <alpha android:duration="@android:integer/config_mediumAnimTime" android:fromAlpha="1.0" android:toAlpha="0.0" /> </set>上面的兩個xml分別對應overridePendingTransition(int enterAnim, int exitAnim) 中的進入和退出動畫
定義當另外一個activity退出時的動畫效果,back_enter.xml
this
<?xml version="1.0" encoding="UTF-8"?> <set android:interpolator="@android:anim/decelerate_interpolator" xmlns:android="http://schemas.android.com/apk/res/android"> <scale android:duration="@android:integer/config_mediumAnimTime" android:pivotX="50.0%" android:pivotY="50.0%" android:fromXScale="1.5" android:toXScale="1.0" android:fromYScale="1.5" android:toYScale="1.0" /> <alpha android:duration="@android:integer/config_mediumAnimTime" android:fromAlpha="0.4" android:toAlpha="1.0" /> </set>back_exit.xml
<?xml version="1.0" encoding="UTF-8"?> <set android:interpolator="@android:anim/decelerate_interpolator" xmlns:android="http://schemas.android.com/apk/res/android"> <scale android:duration="@android:integer/config_mediumAnimTime" android:pivotX="50.0%" android:pivotY="50.0%" android:fromXScale="1.0" android:toXScale="0.4" android:fromYScale="1.0" android:toYScale="0.4" /> <alpha android:duration="@android:integer/config_mediumAnimTime" android:fromAlpha="1.0" android:toAlpha="0.0" /> </set>應該定義一個樣式,在全部包裹activity的地方引入樣式。這樣咱們就想到了AndroidManifest.xml裏的application 了
聲明theme spa
<style name="ThemeActivity" mce_bogus="1"> <item name="android:windowAnimationStyle">@style/AnimationActivity</item> <item name="android:windowNoTitle">true</item> /style>style
<style name="AnimationActivity" parent="@android:style/Animation.Activity" mce_bogus="1"> <item name="android:activityOpenEnterAnimation">@anim/anim_enter</item> <item name="android:activityOpenExitAnimation">@anim/anim_exit</item> <item name="android:activityCloseEnterAnimation">@anim/back_enter</item> <item name="android:activityCloseExitAnimation">@anim/back_exit</item>
以上的兩兩配套,若是定義一個會顯得很難看, 代理
android:activityCloseEnterAnimation指的是關閉activity b,activity a 出來時的動畫,
android:activityCloseExitAnimation
指activity b關閉的動畫,做用與finish操做 code
若是你不想使用style和theme方式定義,那可使用overridePendingTransition(android.R.anim.slide_in_left, android.R.anim.slide_out_right) ;這個方法 server
在startActivity後邊使用,表明的是android:activityOpenEnterAnimation ,android:activityOpenExitAnimation
在finish後使用表明的是android:activityCloseEnterAnimation
android:activityCloseExitAnimation
在AndroidManifest.xml裏邊聲明
<application android:icon="@drawable/ic_launcher" android:theme="@style/ThemeActivity"</span> android:label="@string/app_name" > <activity android:label="@string/app_name" android:name=".GlobalAnimationActivity" > <intent-filter > <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".OtherActivity"></activity> </application>
再來看看overridePendingTransition頁面跳轉動畫的原理 看activity源碼可知 代碼 ActivityManagerNative.getDefault().overridePendingTransition(mToken, getPackageName(), enterAnim, exitAnim); ActivityManagerNative是什麼呢? 看其定義:public abstract class ActivityManagerNative extends Binder implements IActivityManager 須要用到android系統的IPC知識 android自己有不少Service,這些服務從開機啓動就一直在跑,好比media,好比windowmanager,這些服務對外提供接口,有些是一直到最上層都要用到的,好比Media,有些只給內部用,好比windowmanager(這個是service,別跟咱們用的WindowManager混淆了) 只給內部用和給上層用是兩種不一樣的概念。由於內部用的話他們是同一個進程,不必跨進程通訊,也就是沒ipc問題,而給外部用,就須要Ipc了 ActivityManagerNative,他就是IActivityManager的【本地】代理,ActivityManagerNative.getDefault()獲得的就是IActivityManager對象。IActivityManager又是毛???沒錯,它是WindowManagerService的顧客。。。它裏面就是跟WindowManagerService通訊 ,IActivityManager裏面的overridePendingTransition直接跟server端通話。 「Hello,啊 ,WindowManagerService,我是你的代理IActivityManager君啊,剛接到任務要改變activity的切換畫面啊。" "ok,IActivityManager,在外面風吹日曬的辛苦你了,其餘的交給我吧。做爲NB哄哄的Service大人,我幫你解決之。「 堅決果斷的,WindowManagerService執行如下代碼: public void overridePendingAppTransition(String packageName, int enterAnim, int exitAnim) { if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) { mNextAppTransitionPackage = packageName; mNextAppTransitionEnter = enterAnim; mNextAppTransitionExit = exitAnim; } } ,這下已經到了WindowManagerService了,這個方法(overridePendingAppTransition)中mNextAppTransitionEnter等變量賦值。 這些變量在window進行切換的時候會進行處理。remove->removeWindow->removeWindowLocked->applyAnimationLocked(注意,這些說的都是WindowManagerService中的方法) 那麼這個remove(具體是 public void remove(IWindow window) { removeWindow(this, window); })何時用的呢,這個,這個。。。。在ViewRoot和SurfaceView中都會調用到的