Android自定义Activity切换动画完全解析
在Android开发中,Activity之间的切换是最常见的业务场景了,而且系统默认的Activity之间的切换都是带动画效果的(右进右出)。但是有的时候我们不满足于系统的默认动画效果,想自定义Activity之间的切换动画,这时候我们就要分析分析如何自定义出自己想要的动画效果并给Activity应用上了。
基础概念:
四种基本动画:
想自定义Activity切换动画首相要了解Android系统的4中基本动画:translate(平移动画),rotate(旋转动画),scale(缩放动画),alpha(透明度动画)。因为Activity的切换动画无非就是这四种动画的简单组合。
两种实现方式:
自定义动画有两种实现方式:java代码和xml配置。这两种方式都可以实现Activity自定义切换动画的效果,如果所有的Activity都是一样的效果那么只要在xml中配置即可,但是如果有特殊的Activity需要特殊指定的话那么就在java代码中为其指定。
1.java代码实现:
主要是overridePendingTransition()这个方法,如果想要自定义某次Activity切换的动画效果只需要在完成Activity切换的代码之后加上这一句代码,然后传入两个动画效果的资源即可。
注意:
- 方法的第一个参数是跳转过程中将要显示的Activity的入场动画,第二个参数是即将隐藏的Activity的退场动画。
- 这句代码一定要在跳转代码之后加入,一般写在在startActivity()或者finish()调用之后。
2.xml配置:
在你的styles.xml文件中的主题中加入以下四项即可:
<item name="android:activityOpenEnterAnimation">@anim/anim_1</item>
<item name="android:activityOpenExitAnimation">@anim/anim_2</item>
<item name="android:activityCloseEnterAnimation">@anim/anim_3</item>
<item name="android:activityCloseExitAnimation">@anim/anim_4</item>
解释:
- activityOpenEnterAnimation:新Activity入栈时新Activity的入场动画
- activityOpenExitAnimation:新Activity入栈时旧Activity的退场动画
- activityCloseEnterAnimation:顶部Activity出栈时下面Activity的入场动画
- activityCloseExitAnimation:顶部Activity出栈时它的退场动画
系统默认Activity动画分析:
首先看一遍系统默认的Activity切换的动画效果:
可以看到这是一个右进右出的动画效果,但是具体的动画过程是怎么样的呢。系统默认的动画速度太快(250ms)不利于我们进行分析,我们打开手机的开发者选项,将“过渡动画缩放”改为x10。
这时候我们再来观察一下系统的默认切换动画效果:
可以看到Activity2入场动画就是简单的从屏幕右侧平移到屏幕中,Activity1退场动画是缩放动画和透明度动画的简单组合,一边缩小一边变透明。而从Activity2到Activity1的过程基本就是反过来而已,并且其动画的插值器都是减速插值器。既然分析过了系统的默认动画效果,那我们就来实现一下和系统默认动画一模一样的效果。这里为了简便我们使用了xml来配置我们的动画效果。
<item name="android:activityOpenEnterAnimation">@anim/anim_1</item>
<item name="android:activityOpenExitAnimation">@anim/anim_2</item>
<item name="android:activityCloseEnterAnimation">@anim/anim_3</item>
<item name="android:activityCloseExitAnimation">@anim/anim_4</item>
anim_1代码:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="250"
android:interpolator="@android:interpolator/decelerate_quad">
<translate
android:fromXDelta="100%"
android:toXDelta="0" />
</set>
anim_2代码
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="250"
android:interpolator="@android:interpolator/decelerate_quint">
<scale
android:fromXScale="1"
android:fromYScale="1"
android:pivotX="50%"
android:pivotY="50%"
android:toXScale="0.9"
android:toYScale="0.9" />
<alpha
android:fromAlpha="1"
android:toAlpha="0.3" />
</set>
anim_3代码:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:andr