您的位置:首页 > 移动开发 > Android开发

Activity 转场动画踩坑

2018-03-08 16:51 681 查看
目标效果

实现方案
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 Animations

Start an Activity with an Animation

activity and window animation
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息