【Android】Activity之间的切换效果定义

在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、如何自定义,劳烦自行百度。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值