1. 程式人生 > >Android-WindowAnimation和ActivityAnimation的區別和使用

Android-WindowAnimation和ActivityAnimation的區別和使用

Android-WindowAnimation和ActivityAnimation的區別和使用

1. WindowAnimation和ActivityAnimation的區別主要如下:

  • WindowAnimation包括windowEnterAnimation和windowExitAnimation;ActivityAnimation包含android:activityOpenEnterAnimation,android:activityOpenExitAnimation,android:activityCloseEnterAnimation和android:activityCloseExitAnimation。
  • WindowAnimation的控制權大於ActivityAnimation的控制權,即在Activity轉場過程中,如果同時設定了WindowAnimation和ActivityAnimation,那麼可能(因為這種情況非常多)只會執行WindowAnimation。
  • WindowAnimation在style.xml中繼承Animation style的定義如下:
<style name="WindowAnim" parent="@android:style/Animation">
     <!--窗體進入動畫-->
     <item
name="android:windowEnterAnimation">@anim/tweened</item> <!--窗體退出動畫--> <item name="android:windowExitAnimation">@anim/alpha</item> </style>

而ActivityAnimation在style.xml中繼承Animation.Activity的定義如下:

<style name="test_activity_anim" parent="@android:style/Animation.Activity"
> <item name="android:activityOpenEnterAnimation">@anim/alpha</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>
當我們從 A1 啟動 A2 時,A1 從螢幕上消失,這個動畫叫做 android:activityOpenExitAnimation
當我們從 A1 啟動 A2 時,A2 出現在螢幕上,這個動畫叫做 android:activityOpenEnterAnimation
當我們從 A2 退出回到 A1 時,A2 從螢幕上消失,這個叫做 android:activityCloseExitAnimation
當我們從 A2 退出回到 A1 時,A1 出現在螢幕上,這個叫做 android:activityCloseEnterAnimation

從上面WindowAnimation和ActivityAnimation的定義可知,WindowAnimation同一時間只可以控制一個activity的窗體動畫,而ActivityAnimation同一時間可以控制兩個activity的動畫。

2. WindowAnimation的主要使用方式如下:

<style name="WindowAnim"  parent="@android:style/Animation">
        <item name="android:windowEnterAnimation">@anim/tweened</item>
        <item name="android:windowExitAnimation">@anim/alpha</item>
</style>

2.1 在主題中使用

<!-- Base application theme. -->
<style name="AppTheme" parent="android:Theme.Holo.Light">
        <!-- Customize your theme here. -->
        <item name="android:windowAnimationStyle">@style/WindowAnim</item>
</style>
<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

</application>

上面這種方式會使得該應用程式的所有activity都使用WindowAnim樣式。另外也可以像下面只設置指定的activity的動畫。

<activity android:name=".AnimationActivity"
            android:theme="@style/WindowAnim"/>

注意: 上面這樣動畫只在指定的activity上起效果,其他未設定動畫的activity當然就沒有動畫。

2.2 程式碼中的使用

final ImageView imageView = new ImageView(getApplicationContext());
imageView.setImageDrawable(getResources().getDrawable(R.drawable.ic_launcher));
imageView.setVisibility(View.VISIBLE);
mLayoutParams = new WindowManager.LayoutParams();
mLayoutParams.windowAnimations = R.style.WindowAnim; // 窗體的動畫,必須是style中類似WindowAnim的定義樣式
mLayoutParams.x = 0;
mLayoutParams.y = 0;
mLayoutParams.width = ViewGroup.LayoutParams.WRAP_CONTENT;
mLayoutParams.height = ViewGroup.LayoutParams.WRAP_CONTENT;
mLayoutParams.gravity = Gravity.CENTER;
mLayoutParams.flags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; // 該窗體以外的部分也可以獲取焦點
getWindowManager().addView(imageView, mLayoutParams);

上述使用方式的動畫效果必須是在imageView的狀態發生改變時才會觸發,比如imageView由不可見變成可見,或者當mLayoutParams改變時呼叫getWindowManager().updateViewLayout(imageView, mLayoutParam)。

3. ActivityAnimation的主要使用方式如下:

<style name="test_activity_anim" parent="@android:style/Animation.Activity">
        <item name="android:activityOpenEnterAnimation">@anim/alpha</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>

3.1 類似WindowAnimation在主題中使用

<!-- Base application theme. -->
    <style name="AppTheme" parent="android:Theme.Holo.Light">
        <!-- Customize your theme here. -->
        <item name="android:windowAnimationStyle">@style/test_activity_anim</item>
    </style>
<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/test_activity_anim">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

</application>

上面這種方式會使得該應用程式的所有activity都使用test_activity_anim樣式。另外也可以像下面只設置指定的activity的動畫。

<activity android:name=".AnimationActivity"
            android:theme="@style/test_activity_anim"/>

注意: 上面這樣動畫只指定的activity上起效果,其他未設定動畫的activity當然就沒有動畫。

3.2 在程式碼中的使用

在Activity類中可以使用下面函式來自定義activity的動畫:

// enterAnim:第二個activity進入的動畫; exitAnim 第一個activity退出的動畫; 引數型別:在anim資料夾下的動畫
overridePendingTransition(int enterAnim, int exitAnim);

注意:上面函式的呼叫一般在startActivity()或者finish()之後。