目标效果
页面出现的效果是自下向上滑入,消失的效果是自上向下滑出,时长、速度未知。
实现方案
为表述方便,我们假设由 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
slide_out_down.xml
anim_hold.xml
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
@color/colorPrimary
@color/colorPrimaryDark
@color/colorAccent
@style/MyActivityTransitionAnimation
@anim/slide_in_up
@anim/anim_hold
@anim/slide_out_down
@anim/anim_hold
AndroidManifest.xml
效果(锤子 t2,5.1.1 安卓系统):
图2
效果(mate 9 pro,8.0 安卓系统):
图3
即控制 Activity 动画的方式有兼容性问题,在某些机型上某个或全部属性均失效。
再来试下控制 Window 的动画。
styles.xml
AndroidManifest.xml
效果(锤子 t2):
图4
效果(mate 9 pro):
图5
可以看到,除了黑屏问题,在 mate 9 pro 上同样存在 exit 属性失效的问题。
优势:只设置目标 Activity 接口,不需要在每个入口页面都设置一遍
劣势:兼容性不好,在某些机型上存在属性失效的问题
而且,上面的兼容性还未考虑 Activity 的启动模式,不知道在这方面会不会也有坑。
参考文章