在Android开发过程中,经常会碰到Activity之间的切换效果的问题,下面介绍一下如何实现左右滑动的切换效果。
在无特殊声明的情况下,以下部分提及的入场动画是指startActivity的效果。出场动画是指finish的效果。
做Activity的页面切换,我所了解到的共有两种方法:
一、使用style定义页面切换动画,大致方法如下:
1、在style.xml中添加如下定义
<resources>
<!-- 页面弹出(入场出场)动画 -->
<style name="AnimationActivity" parent="@android:style/Animation">
<item name="android:activityOpenEnterAnimation">@anim/slide_in_right</item>
<item name="android:activityOpenExitAnimation">@anim/slide_out_left</item>
<item name="android:activityCloseEnterAnimation">@anim/slide_in_left</item>
<item name="android:activityCloseExitAnimation">@anim/slide_out_right</item>
</style>
<!-- 通用主题定义,全屏,无标题 -->
<style name="AppBaseTheme" parent="android:Theme.Light.NoTitleBar.Fullscreen">
</style>
<!-- 带页面弹出动画的主题样式 -->
<style name="ActivitySlideTheme" parent="AppBaseTheme">
<item name="android:windowAnimationStyle">@style/AnimationActivity</item>
</style>
</resources>
2、指定【带页面弹出动画的主题样式】
a、如果需要全局支持,则在application标签中定义。
<application android:theme="@style/ActivitySlideTheme">
b、如果仅需要支持个别页面,则在具体Activity声明出标记。
<activity
android:name=".activity.TestActivity"
android:theme="@style/ActivitySlideTheme"
android:screenOrientation="portrait" >
</activity>
3、注意事项:
a、【页面弹出(入场出场)动画】部分,不同参数理解如下:
定义入场动画,OpenEnter是对被启动页面的动画定义,OpenExit是对当前页面的动画定义。
android:activityOpenEnterAnimation
android:activityOpenExitAnimation
定义出场动画,CloseEnter是对当前页面关闭后要显示页面的动画定义,CloseExit是对当前页面的动画定义。
android:activityCloseEnterAnimation
android:activityCloseExitAnimation
b、该方式定义的切换动画对入场动画(startActivity)有效果,但是对出场动画(finish)无效。具体原因,目前未果。如有了解的,还望评论指正。
处理方案是使用overridePendingTransition方法处理出场动画,具体使用下面会提到。
二、使用Android2.0在Activity中新增的方法
public void overridePendingTransition (int enterAnim, int exitAnim)
其中:
enterAnim 定义Activity进入屏幕时的动画,即将展示页面的动画
exitAnim 定义Activity退出屏幕时的动画,即将关闭或者被隐藏页面的动画
该方法可以用于对入场和出场动画进行定义。具体使用如下:
1、overridePendingTransition 方法必须在startActivity()或者 finish()方法的后面。
2、startActivity()之后使用定义的是入场动画。
3、finish()之后使用定义的是出场动画。
4、注意,在定义入场动画时,应该确保在主线程运行,否则有可能会无效。所以,尽量在调用处用Activity.runOnUiThread(new Runnable() {XXXX});包裹。如下:
baseActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
Intent intent = new Intent(baseActivity,TestActivity.class);
// 添加参数
intent.putExtra(Constants.KEY_INETNT_PARAMS,params);
baseActivity.startActivity(intent);
// 定义出入场动画
baseActivity.overridePendingTransition(R.anim.in_from_right,R.anim.fade_out);
}
});
三、两个方法对比
1、使用overridePendingTransition方法指定切换动画虽然有效,但是使用成本较大。
finish还好,可以在需要的页面中定义下(或者重写finish方法)。
但是startActivity()就要在每次启动时写一次,好烦。(当然如果做全局控制的话,可以在Base类中重写startActivity()方法)
2、使用style,虽然可以一处定义多处使用,但是出场动画无效是个蛮尴尬的问题。当然之前说到的解决方案也没什么神秘可言。就是在需要的地方(finish()方法之后)调用下overridePendingTransition。如下:
/**
* 点击系统返回和页面返回键时的处理
*/
private void backClick() {
finish();
// 定义出入场动画
overridePendingTransition(R.anim.out_to_right_abit,R.anim.out_to_right);
}
四、关于动画的定义
1、Android已经内置了几种动画效果,可以见 android.R.anim 类。
2、如何自定义,劳烦自行百度。