1.overridePendingTransition
Android在开发过程中,两个Activity切换需要设置动画效果时,在Android 2.0 之后可以使用overridePendingTransition方法。
overridePendingTransition直译过来就是“覆盖 即将到来的 过渡动画”。也就是通过这个方法添加的跳转动画会覆盖掉即将到来的跳转动画效果。也就是说即使不使用overridePendingTransition(),也会存在Activity切换动画,这个切换动画可能来自于其他方式添加的跳转动画,也可以来自于系统自带的默认动画。事实上,即使不通过任何方法添加Activity跳转动画,Activity也会有默认的跳转动画,这个默认的跳转动画定义在Android主题中。在android:Theme主题中可以看到这样一句样式定义,正是这句为App中所有Activity添加了一个默认的切换动画。
<item name="windowAnimationStyle">@style/Animation.Activity</item>
需要注意的是,@style/Animation.Activity中定义的动画样式在不同的系统版本上会有所不同,此外部分Theme自定义了新的windowAnimationStyle,所以默认的Activity动画并非一定是@style/Animation.Activity中定义的样子。
Activity的切换包括从一个Activity跳转到一个新的Activity或者退出当前Activity回到原来的Activity,所以存在两种动画:一种是Activity退出时的动画,一种是Activity进入时的动画。它们都可以通过overridePendingTransition()来设置,要设置启动时的动画需要在执行startActivity()或startActivityForResult()之后调用overridePendingTransition(),要设置返回时的动画需要在finish()之后调用overridePendingTransition()。启动动画和返回动画是相互独立的,设置启动动画不会对返回动画产生影响,如果只在startActivity()或startActivityForResult()之后调用了overridePendingTransition(),没有在finish()的时候调用,则Activity返回的时候仍然是默认的动画效果,也可以在finish()的时候使用和启动时不同的动画效果。
overridePendingTransition(int enterAnim, int exitAnim)
参数说明:
enterAnim:Activity进入动画资源id
exitAnim:Activity退出动画资源id
overridePendingTransition()只能作用在通过startActivity()或startActivityForResult()和finish()方式启动和结束Activity的场景下,其他情况下的Activity创建和退出是不会有任何效果的。例如通过recreate()重建Activity,在其后执行overridePendingTransition()是没有动画效果的。
如果没有Activity的切换动画,Activity的显示和隐藏会立刻完成,如果存在切换动画,Activity不会立即显示或者消失,会跟随动画执行显示隐藏。这一点很重要,后面的黑屏原理会用到此处知识。
注意:
①overridePendingTransition必需紧挨着startActivity()或者finish()函数之后调用;
②overridePendingTransition在android2.0及以上版本才支持;
③如果不需要切换动画,即去掉系统默认自带的动画效果,可以设置
overridePendingTransition(0,0);
④overridePendingTransition只能在主线程中调用;
⑤进入和退出动画的时间设置要一样,不然会有黑屏效果。
例如:从ActivityA打开ActivityB,如果进入界面动画快,退出界面动画慢,进入动画还没有执行完,退出动画已执行完,ActivityA会变成黑屏。
⑥如果一个Activity需要动画,另外一个不需要变化,也请设置时间相同的没有任何变化的动画,防止黑屏出现。
⑦从一个ActivityA跳转到ActivityB,ActivityB会执行进入动画,ActivityA会执行退出动画。从ActivityB回退到ActivityA,ActivityB会执行退出动画,ActivityA会执行进入动画。
2.可能遇到的问题
①黑屏问题
translate_in.xml(从左侧进入):
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="-100%"
android:toXDelta="0"
android:duration="2000">
</translate>
Intent intent = new Intent(Activity1.this, Activity2.class);
startActivity(intent);
overridePendingTransition(R.anim.translate_in,0);
从Activity1跳转到Activity2,实现了进入Activity2从左侧平移进入的效果,但是会看到平移Activity2的过程中底部Activity1变成了黑色,也就是出现了黑屏。这是因为overridePendingTransition(R.anim.transla