Activity自定义过渡动画,如下图所示:

Activity自定义过渡动画_xml

 

要想实现上面的效果,先明白下面四个概念:

以第一个 activity 进入第二个 activity 为例;

activityOpenEnterAnimation :第二个 activity 的进入动画  (第一个 activity 进入第二个 activity)
activityOpenEnterAnimation :第一个 activity 的退出动画 (第一个 activity 进入第二个 activity)
activityCloseEnterAnimation :第一个 activity 的进入动画 (第二个 activity 返回第一个 activity)
activityCloseExitAnimation :第二个 activity 的退出动画  (第二个 activity 返回第一个 activity)

上面的概念理解完毕,再了解 translate 的几个属性:

duration="200"   动画持续时间为200毫秒

fromXDelta="0"  动画从X轴坐标为0的地方开始

toXDelta="100%p" 动画以X轴屏幕最大处结束

 

除此之外,要了解屏幕的坐标系,它是以屏幕左上角为原点,往右是X轴正方向,往下是Y轴正方向,如下图:

Activity自定义过渡动画_Activity自定义过渡动画_02

 

下面来看代码,首先在styles 中自定义名字为 ActivityAnimation 的 style,代码如下:

<style name="ActivityTheme" parent="@style/Theme.AppCompat.DayNight.NoActionBar">
        <item name="android:windowAnimationStyle">@style/ActivityAnimation</item>
    </style>

    <style name="ActivityAnimation" parent="@android:style/Animation.Activity">
        <item name="android:activityOpenEnterAnimation">@anim/anim_open_enter</item>
        <item name="android:activityOpenExitAnimation">@anim/anim_open_exit</item>
        <item name="android:activityCloseEnterAnimation">@anim/anim_close_enter</item>
        <item name="android:activityCloseExitAnimation">@anim/anim_close_exit</item>
    </style>

 

anim_open_enter :
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/decelerate_interpolator">
    <!-- 第一个activity到第二个activity -->
    <!-- 第二个activity进入动画 -->
    <translate
        android:duration="200"
        android:fromXDelta="100%p"
        android:toXDelta="0" />
</set>

 

anim_open_exit :
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/decelerate_interpolator">
    <!-- 第一个activity到第二个activity -->
    <!-- 第一个activity退出动画 -->
    <translate
        android:duration="200"
        android:fromXDelta="0"
        android:toXDelta="-100%p" />
</set>

 

anim_close_enter :
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/decelerate_interpolator">
    <!-- 第一个activity到第二个activity -->
    <!-- 第一个activity进入动画 -->
    <translate
        android:duration="200"
        android:fromXDelta="-100%p"
        android:toXDelta="0" />
</set>

 

anim_close_exit :
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/decelerate_interpolator">
    <!-- 第一个activity到第二个activity -->
    <!-- 第二个activity退出动画 -->
    <translate
        android:duration="200"
        android:fromXDelta="0"
        android:toXDelta="100%p" />
</set>

 

最后在 AndroidManifest.xml 文件中应用:

<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/ActivityTheme">
        <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=".AnimationActivity"/>

    </application>

这样就可以实现最上面的效果了。