哲的Android应用精工坊

致力于优秀Android应用设计与开发

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

demo下载地址

 

由于不同厂商和系统版本对默认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.保证与系统风格合理衔接。 

posted on 2012-12-11 15:58  JovianChen  阅读(643)  评论(0)    收藏  举报