关于android:windowAnimationStyle
安卓全局活动切换动画,windowAnimationStyle与overridePendingTransition两种实现
Android动画全篇系列(十一)——Activity转场动画
Android Activity跳转动画 - overridePendingTransition用法及原理分析
一、overridePendingTransition 介绍 :
/**
/**
*在{@link#startActivity(Intent)}的一种风格之后立即调用
*或{@link#finish}来指定一个显式过渡动画
*接下来执行。
*<p>截至{@linkandroid.os.Build.VERSION_CODES#JELLY_BEAN}的替代方案
*将其用于启动活动就是提供所需的动画
*通过{@link ActivityOptions}捆绑包将信息发送到
*{@link#startActivity(Intent,Bundle)}或相关函数。这允许
*您可以指定自定义动画,即使在从开始活动时也是如此
*在当前顶级活动的上下文之外。
*@param enterAnim : 要用于的动画资源的资源ID
*传入活动。使用0表示没有动画。
*@param exitAnim : 要用于的动画资源的资源ID
*传出的活动。使用0表示没有动画。*/
public void overridePendingTransition(int enterAnim, int exitAnim) {try {ActivityTaskManager.getService().overridePendingTransition(mToken, getPackageName(), enterAnim, exitAnim);} catch (RemoteException e) {}
}
上面的注释中可以看到,
- 这个方法需要在startActivity()或者finish()方法之后立即被调用。
启动后:
startActivity(new Intent(A.this, B.class));
overridePendingTransition(inAnim, outAnim);
结束时:
finish();
activity.overridePendingTransition(inAnim, outAnim);
- 第一个参数enterAnim:设置下一个即将到来的Activity的进入动画;
- 第二个参数exitAnim:设置当前即将退出的这个Activity的退出动画。
第一个参数就是进入时的动画,第二个参数就是离开时的参数。不管是startActivity()还是finish()时使用,都遵循这个原则
- 当设置为0时表示没有动画。
二、demo
1、定义动画
anim/open_enter :
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"><scaleandroid:duration="@android:integer/config_longAnimTime"android:fromXScale="0.1"android:fromYScale="0.1"android:toXScale="1.0"android:toYScale="1.0" />
</set>
anim/open_exit :
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"><scaleandroid:duration="@android:integer/config_longAnimTime"android:fromXScale="1.0"android:fromYScale="1.0"android:toXScale="0.1"android:toYScale="0.1" />
</set>
anim/close_exit :
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"><alphaandroid:duration="@android:integer/config_longAnimTime"android:fromAlpha="1.0"android:toAlpha="0.0" />
</set>
anim/close_enter:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"><alphaandroid:duration="@android:integer/config_longAnimTime"android:fromAlpha="0.0"android:toAlpha="1.0"/>
</set>
2、使用方式一:
<style name="AnimAppTheme" parent="@style/Theme.AppCompat.DayNight.NoActionBar"><item name="android:windowAnimationStyle">@style/ActivityAnimationTheme</item>
</style><style name="ActivityAnimationTheme" parent="@android:style/Animation.Activity"><!--打开activity时,新进入的activity执行的动画--><item name="android:activityOpenEnterAnimation">@anim/open_enter</item><!--打开activity时,原来的activity执行的动画--><item name="android:activityOpenExitAnimation">@anim/open_exit</item><!-- --><!--退出activity时,退出的activity执行的动画--><item name="android:activityCloseExitAnimation">@anim/close_exit</item><!--退出activity时,重新显示的activity执行的动画--><item name="android:activityCloseEnterAnimation">@anim/close_enter</item>
</style>
-
从A1启动A2:
- android:activityOpenEnterAnimation:A2进入动画
- android:activityOpenExitAnimation:A1退出动画
-
从A2返回A1:
- android:activityCloseEnterAnimation:A1进入动画
- android:activityCloseExitAnimation:A2退出动画
3、使用方式二:
public class BaseActivity extends AppCompatActivity {private static final String TAG = BaseActivity.class.getSimpleName();@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);overridePendingTransition(R.anim.open_enter, R.anim.open_exit);Log.e(TAG, "has been created : 【缩放】");}/*** finish方法比onDestroy方法先执行,* 我们的overridePendingTransition需要在finish里面执行才生效。*/@Overridepublic void finish() {super.finish();overridePendingTransition(R.anim.close_enter, R.anim.close_exit);Log.e(TAG, "has been finish : 【透明度】");}@Overrideprotected void onDestroy() {super.onDestroy();//这里面定义的动画并未生效//overridePendingTransition(R.anim.close_enter,R.anim.close_exit);Log.e(TAG, "has been Destroyed");}
}