Activity 转场动画踩坑

  • 目标效果
  • 实现方案
    • 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


<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):
Activity 转场动画踩坑_第1张图片
图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 安卓系统):
Activity 转场动画踩坑_第2张图片
图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 的启动模式,不知道在这方面会不会也有坑。

参考文章

  • Defining Custom Animations
  • Start an Activity with an Animation
  • activity and window animation

你可能感兴趣的:(Android,UI,开发,Android,UI,开发)