android activity切換動畫

 Activity的切換動畫指的是從一個activity跳轉到另一個activity時的動畫。
它包括兩個部分:一部分是第一個activity退出時的動畫;另一部分時第二個activity進入時的動畫;


在Android的2.0版本以後,有了一個函數來幫咱們實現這個動畫。這個函數就是overridePendingTransition
這個函數有兩個參數,一個參數是第一個activity退出時的動畫,另一個參數則是第二個activity進入時的動畫。
        這裏須要特別說明的是,關於overridePendingTransition這個函數,有兩點須要主意
        1.它必需緊挨着startActivity()或者finish()函數以後調用"
        2.它只在android2.0以及以上版本上適用  

 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中都會調用到的

相關文章
相關標籤/搜索