一、overridePendingTransition作用
先看这个名字,这个方法名很长,由三个单词组成,override是重写,覆盖的意思,pending表示即将到来的,transtition表示过渡,转换,也就是过渡动画的意思。三个单词连起来的意思就是覆盖即将到来的跳转动画,也就是可以通过这个方法添加的跳转动画会覆盖掉即将到来的跳转动画效果。即将到来的这个词很有意思,它表示即使不使用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中定义的样子。
二、overridePendingTransition()使用方法
Activity的切换动画从业务层面上来说可以分为两种,一种是Activity启动时的动画,一种是从Activity返回时的动画,它们都可以通过overridePendingTransition()来设置,要设置启动时的动画需要在执行startActivity()或startActivityForResult()之后调用overridePendingTransition(),要设置返回时的动画需要在finish()之后调用overridePendingTransition()。启动动画和返回动画是相互独立的,设置启动动画不会对返回动画产生影响,如果只在startActivity()或startActivityForResult()之后调用了overridePendingTransition(),没有在finish()的时候调用,则Activity返回的时候仍然是默认的动画效果,也可以在finish()的时候使用和启动时不同的动画效果。
由于startActivity()和startActivityForResult()本质上是一样的,为了表述方便,后文不再提到startActivityForResult(),所有使用startActivity()的地方都可以用startActivityForResult()。
overridePendingTransition()只能作用在通过startActivity()和finish()方式启动和结束Activity的场景下,其他情况下的Activity创建和退出是不会有任何效果的。例如通过recreate()重建Activity,在其后执行overridePendingTransition()是没有动画效果的。
四、startActivity去掉自带的动画效果
1、第一种就是在startActivity的时候加上overridePendingTransition,例如:
Intent intent = new Intent(context, MainActivity2.class);
context.startActivity(intent);
context.overridePendingTransition(0, 0);
2、第二种方法就是在styles.xml文件修改
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!--去掉动画-->
<item name="android:windowAnimationStyle">@style/Animation</item>
</style>
<style name="Animation">
<item name="android:activityOpenEnterAnimation">@null</item>
<item name="android:activityOpenExitAnimation">@null</item>
<item name="android:activityCloseEnterAnimation">@null</item>
<item name="android:activityCloseExitAnimation">@null</item>
<item name="android:taskOpenEnterAnimation">@null</item>
<item name="android:taskOpenExitAnimation">@null</item>
<item name="android:taskCloseEnterAnimation">@null</item>
<item name="android:taskCloseExitAnimation">@null</item>
<item name="android:taskToFrontEnterAnimation">@null</item>
<item name="android:taskToFrontExitAnimation">@null</item>
<item name="android:taskToBackEnterAnimation">@null</item>
<item name="android:taskToBackExitAnimation">@null</item>
</style>