由于不同厂商和系统版本对默认Activity切换动画提供了不同的样式,为了使我们的App在界面交互达到精致细腻的效果,需要自己设计和应用合适的切换动画。
我希望Phome的Activity间切换的动画足够直率和轻松。我将其设计为左右推动效果的切换动画,主Activity在左,次级Activity在右,无需任何花哨的渐变和缩放,并将动画持续时间校至为适中。
实现的关键方法为Activity类的overridePendingTransition(int enterAnim, int exitAnim)方法,指定一个out动画资源一个in动画资源,以构成这一切换过程。在方法说明中,建议开发者将该方法的调用紧跟在startActivity(Intent)或finish()方法调用之后。
1)
开始动手吧。先做出从主Activity到次级Activity的切换动画,是一个左推的效果,相应的的in和out动画资源文件如下:
res\anim\slide_in_left.xml
<?xml version="1.0" encoding="utf-8"?> <translate xmlns:android="http://schemas.android.com/apk/res/android" android:duration="@android:integer/config_mediumAnimTime" android:fromXDelta="100%p" android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:toXDelta="0" > </translate>
res\anim\slide_out_left.xml
<?xml version="1.0" encoding="utf-8"?> <translate xmlns:android="http://schemas.android.com/apk/res/android" android:duration="@android:integer/config_mediumAnimTime" android:fromXDelta="0" android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:toXDelta="-100%p" > </translate>
2)
在主Activity的startActivity(Intent)方法后加上overridePendingTransition(R.anim.slide_in_left, R.anim.slide_out_left);
运行之,你就可以看到出来的效果了。
3)
好的,接下来我们做从次级Activity返回到主Activity的切换动画。
与主->次的左推效果相对应,我们先准备次->主的右推的in与out动画资源文件。
res\anim\slide_in_right.xml
<?xml version="1.0" encoding="utf-8"?> <translate xmlns:android="http://schemas.android.com/apk/res/android" android:duration="@android:integer/config_mediumAnimTime" android:fromXDelta="-100%p" android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:toXDelta="0" > </translate>
res\anim\slide_out_right.xml
<?xml version="1.0" encoding="utf-8"?> <translate xmlns:android="http://schemas.android.com/apk/res/android" android:duration="@android:integer/config_mediumAnimTime" android:fromXDelta="0" android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:toXDelta="100%p" > </translate>
4)
若次级Activity中使用finish()方法来返回上级,则直接在该方法之后加上overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_right);
运行之,就可以看到两个Activity之间漂亮的动画过度了。
但很快就会发现一些问题——当在次级Activity中按设备返回键返回上级时,没有触发该覆写过度动画的方法,在该方法说明中也没有针对这种情况进行指导。这里,我找到了两种解决方法:
方法一:在Activity的onPause()回调方法中调用overridePendingTransition方法。无论通过何种方式结束该次级Activity,将在onPause()回调时调用到该动画覆写方法。相应的问题是在次级Activity中按设备Home键,也会以该动画退回到系统主屏,看起来有点怪呵?
方法二:覆写onKeyDown()方法,监听返回键,手动执行finish()方法,同时调用overridePendingTransition方法。与方法一相比,次级Activity中Home回系统主屏的动画保持系统默认的原汁原味。
个人比较喜欢第二种,喜欢在保证自己App设计效果的同时保持自己与系统默认效果的衔接性。除了返回键,如果还有其他的回退方式,使得次级Activity返回上级而没调用到动画覆写方法的话,希望各位提点。
--- 12.17更新方法 ---
除了代码中使用overridePendingTransition方法动态设定,还可以在manife文件中通过theme元素静态设定。
1)
做好以上4个动画资源文件。
2)
在res\values\styles.xml中写入以下动画样式(demo中命名为ActivitySlideAnim)
<style name="ActivitySlideAnim" parent="@android:style/Animation.Activity"> <!-- 在该Activity中启动其他Activity时的进入者动画 --> <item name="android:activityOpenEnterAnimation">@anim/slide_in_left</item> <!-- 在该Activity中启动其他Activity时的退出者动画 --> <item name="android:activityOpenExitAnimation">@anim/slide_out_left</item> <!-- 从其他Activity返回至该Activity时的进入者动画 --> <item name="android:activityCloseEnterAnimation">@anim/slide_in_right</item> <!-- 从其他Activity返回至该Activity时的退出者动画 --> <item name="android:activityCloseExitAnimation">@anim/slide_out_right</item> </style>
3)
查看manifest中<application>标签属性中使用的android:theme样式,将该样式item的android:windowAnimationStyle属性设定为ActivitySlideAnim,如demo中的
<style name="AppTheme" parent="AppBaseTheme"> <item name="android:windowAnimationStyle">@style/ActivitySlideAnim</item> </style>
搞定!运行之看看效果吧。
建议:
1.保证应用风格一致性,切忌过度粉饰;
2.保证与系统风格合理衔接。

浙公网安备 33010602011771号