Activity 转场动画踩坑



目标效果

这里写图片描述

页面出现的效果是自下向上滑入,消失的效果是自上向下滑出,时长、速度未知。

实现方案

为表述方便,我们假设由 Activity A 打开 Activity B。

Activity#overridePendingTransition()

A 页面不变,B 页面出现,在 Activity A 中 startActivity() 后面添加代码:

overridePendingTransition(android.R.anim.slide_in_up, R.anim.anim_hold);

注意,如果第二个参数为 0,切换时未出现黑色背景。

slide_in_up.xml


<translate xmlns:android="http://schemas.android.com/apk/res/android" android:duration="300" android:fromYDelta="100%" android:interpolator="@android:anim/accelerate_interpolator" android:startOffset="0" android:toXDelta="0" />

slide_out_down.xml


<translate xmlns:android="http://schemas.android.com/apk/res/android" android:duration="300" android:fromYDelta="0%p" android:interpolator="@android:anim/accelerate_interpolator" android:toYDelta="100%p" />

anim_hold.xml


<translate xmlns:android="http://schemas.android.com/apk/res/android" android:duration="200" android:fromYDelta="0" android:toYDelta="0" />

注意,anim_hold.xml 中的 duration 不能设置过长,否则,页面过度已完成立即返回桌面,Activity A 依然在展示,覆盖在桌面上。

A 页面不变,B 页面消失的动画,是在 Activity B 中 finish() 后面添加代码:

overridePendingTransition(0, android.R.anim.slide_out_down);

效果(锤子 t2 和 华为 mate 9 pro):

图1

优势:兼容性好,没有版本和机型的限制;
劣势:如果 B 页面的入口较多,则每个入口页面都要添加动画代码。

android:windowAnimationStyle

该方式纯靠 xml 文件完成,而不借助 Java 代码。
具体有两种形式,一个是控制 Activity 动画的,一种是控制 Window 动画的。我们先看第一种。

styles.xml

 -- Base application theme. -->
    

    

    

AndroidManifest.xml


<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <application  android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            intent-filter>
        activity>
        <activity  android:name=".Main2Activity" android:theme="@style/TransitionAnimationTheme" />
    application>

manifest>

效果(锤子 t2,5.1.1 安卓系统):

图2

效果(mate 9 pro,8.0 安卓系统):

图3

即控制 Activity 动画的方式有兼容性问题,在某些机型上某个或全部属性均失效。

再来试下控制 Window 的动画。

styles.xml

<resources>

    
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> -- Customize your theme here. --> <item name="colorPrimary">@color/colorPrimary "colorPrimaryDark">@color/colorPrimaryDark "colorAccent">@color/colorAccent style>

    <style name="WindowTransitionAnimation"> <item name="android:windowEnterAnimation">@anim/slide_in_up "android:windowExitAnimation">@anim/slide_out_down style>

    <style name="WindowTransitionAnimationTheme" parent="AppTheme"> <item name="android:windowAnimationStyle">@style/WindowTransitionAnimation style>

resources>

AndroidManifest.xml

<activity  android:name=".Main2Activity" android:theme="@style/WindowTransitionAnimationTheme" />

效果(锤子 t2):

图4

效果(mate 9 pro):


图5

可以看到,除了黑屏问题,在 mate 9 pro 上同样存在 exit 属性失效的问题。

优势:只设置目标 Activity 接口,不需要在每个入口页面都设置一遍
劣势:兼容性不好,在某些机型上存在属性失效的问题

而且,上面的兼容性还未考虑 Activity 的启动模式,不知道在这方面会不会也有坑。

参考文章