目标效果
页面出现的效果是自下向上滑入,消失的效果是自上向下滑出,时长、速度未知。
实现方案
为表述方便,我们假设由 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 的启动模式,不知道在这方面会不会也有坑。