在开发产品的过程中,遇到了需要去除 Activity 启动时的默认动画的需要。
Activity 的动画,如果 Activity 是自己可控的,那么一般的处理方式是两步。首先重写 Activity 的 Theme 中的 windowAnimationStyle
相关属性,并保存在 res/values/styles.xml
,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<style name="Theme.noAnimation" parent="android:Theme.Light.NoTitleBar.Fullscreen"> <item name="android:windowAnimationStyle">@style/noAnimation</item> </style> <style name="noAnimation"> <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> |
其次在不想有动画的 Activity 上设置此属性,
1 2 3 4 5 |
<activity android:name="com.foo.bar.main.activity.LoginActivity" android:screenOrientation="portrait" android:theme="@style/Theme.noAnimation"> ... |
这个方法,姑且称之为方法一吧,来自于 https://blog.51cto.com/u_1472521/5138835。但测试发现没有奏效,也许跟要启动的 Activity 是透明的有关。
接着找到的是方法二,要利用 overridePendingTransition()
。在 Activity 中使用它来控制两个 Activity 切换时的动画。有两个参数:进入动画和出去的动画。
注意:
1、必须在 startActivity()
或 finish()
之后立即调用;
2、而且在 2.1 以上版本有效;
3、手机设置-显示-动画,为开启状态。
1 2 3 4 5 6 7 8 9 10 11 |
// 实现淡入浅出的效果 startActivity(new Intent(MainActivity.this, SecondActivity.class)); overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out); // 由左向右滑入的效果 startActivity(new Intent(MainActivity.this, SecondActivity.class)); overridePendingTransition(android.R.anim.slide_in_left, android.R.anim.slide_out_right); // 实现 zoommin 和 zoomout (自定义的动画) startActivity(new Intent(OverridePendingTransitionActivity.this, SecondActivity.class)); overridePendingTransition(R.anim.zoomin, R.anim.zoomout); |
但这个是要求调用者明确指定,跟需求场景中调用者是系统启动器的情况偏离更大,作为开发者,没办法把这样的代码增加到启动器的行为里。最后发现了方法三,在这儿:https://www.orcode.com/question/1254347_k20608.html(这个网站可能是个农场,我没细看),其实就一句话:intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
。在创建快捷方式时,把这个标志加入到启动目标 Activity 的 Intent 里就好。不过后来查看更多的信息时,有提到这个标志可能会有副作用,具体请参看这儿:https://www.semicolonworld.com/question/47373/disable-activity-slide-in-animation-when-launching-new-activity(其实这个页面我就没再细看了,毕竟问题已经解决了,有需要时再看,留此备档)。