Activity自定义过渡动画,如下图所示:
要想实现上面的效果,先明白下面四个概念:
以第一个 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轴正方向,如下图:
下面来看代码,首先在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>
这样就可以实现最上面的效果了。