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()之后。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值