Activity 转场动画踩坑
2018-03-08 16:51
681 查看
目标效果
实现方案
Activity#overridePendingTransition()
android:windowAnimationStyle
参考文章
页面出现的效果是自下向上滑入,消失的效果是自上向下滑出,时长、速度未知。
注意,如果第二个参数为 0,切换时未出现黑色背景。
slide_in_up.xml
slide_out_down.xml
anim_hold.xml
A 页面不变,B 页面消失的动画,是在 Activity B 中 finish() 后面添加代码:
效果(锤子 t2 和 华为 mate 9 pro):
图1
优势:兼容性好,没有版本和机型的限制;
劣势:如果 B 页面的入口较多,则每个入口页面都要添加动画代码。
具体有两种形式,一个是控制 Activity 动画的,一种是控制 Window 动画的。我们先看第一种。
styles.xml
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 的启动模式,不知道在这方面会不会也有坑。
Start an Activity with an Animation
activity and window animation
实现方案
Activity#overridePendingTransition()
android:windowAnimationStyle
参考文章
目标效果
页面出现的效果是自下向上滑入,消失的效果是自上向下滑出,时长、速度未知。
实现方案
为表述方便,我们假设由 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
<?xml version="1.0" encoding="utf-8"?> <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
<?xml version="1.0" encoding="utf-8"?> <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
<?xml version="1.0" encoding="utf-8"?> <translate xmlns:android="http://schemas.android.com/apk/res/android" android:duration="2000" android:fromYDelta="0" android:toYDelta="0" />
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. --> <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <!-- Customize your theme here. --> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> </style> <style name="TransitionAnimationTheme" parent="AppTheme"> <item name="android:windowAnimationStyle">@style/MyActivityTransitionAnimation</item> </style> <style name="MyActivityTransitionAnimation"> <!-- B 进入 --> <item name="android:activityOpenEnterAnimation">@anim/slide_in_up</item> <!-- A 退出 --> <item name="android:activityOpenExitAnimation">@anim/anim_hold</item> <!-- B 退出 --> <item name="android:activityCloseExitAnimation">@anim/slide_out_down</item> <!-- A 进入 --> <item name="android:activityCloseEnterAnimation">@anim/anim_hold</item> </style>
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <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> <!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <!-- Customize your theme here. --> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> </style> <style name="WindowTransitionAnimation"> <item name="android:windowEnterAnimation">@anim/slide_in_up</item> <item name="android:windowExitAnimation">@anim/slide_out_down</item> </style> <style name="WindowTransitionAnimationTheme" parent="AppTheme"> <item name="android:windowAnimationStyle">@style/WindowTransitionAnimation</item> </style> </resources>
AndroidManifest.xml
<activity android:name=".Main2Activity" android:theme="@style/WindowTransitionAnimationTheme" />
效果(锤子 t2):
图4
效果(mate 9 pro):
图5
可以看到,除了黑屏问题,在 mate 9 pro 上同样存在 exit 属性失效的问题。
优势:只设置目标 Activity 接口,不需要在每个入口页面都设置一遍
劣势:兼容性不好,在某些机型上存在属性失效的问题
而且,上面的兼容性还未考虑 Activity 的启动模式,不知道在这方面会不会也有坑。
参考文章
Defining Custom AnimationsStart an Activity with an Animation
activity and window animation
相关文章推荐
- Android5.0之Activity的转场动画
- Activity与Fragment的转场动画.
- 一个从底部进入的activity转场动画Demo
- Android Activity和Fragment的转场动画
- Android Activity和Fragment的转场动画
- 关于activity转场动画makeSceneTransitionAnimation没效果的问题的解决办法
- Android5.0之Activity的转场动画
- 你所不知道的Activity转场动画——ActivityOptions,activity转场动画
- Android5.0之Activity的转场动画
- Activity取消默认转场动画;去掉默认转场动画;
- 你所不知道的Activity转场动画——ActivityOptions
- Activity之间转场动画
- Activity和Frament转场动画
- Activity转场动画(5.0+)
- overridePendingTransition设定两个activity之间的转场动画没有效果,但不报错! (大神帮帮我吧,代码如下,谢谢)
- 实现Activity间的共享控件转场动画
- Android动画:转场动画(过度动画) ActivityOptionsCompat
- 关于Activity的转场动画失效问题
- Android 避免Activity转场动画退出时候和系统自带的一起出现
- Activity转场动画(透明Activity)