Activity 和 Fragment 跳转动画

Activity 转场动画

Activity转场动画是是通过overridePendingTransition(int enterAnim, int exitAnim)实现的。

这个方法是API Level 5 加入的。

这个方法在startActivity(Intent) or finish()之后被调用,指定接下来的这个转场动画。

方法的第一个参数:enterAnim,是新的Activity的进入动画的resource ID;第二个参数exitAnim,是旧的Activity(当前的Activity)离开动画的resource ID。
所以这两个参数的对象是两个Activity。如果上面两个参数没有动画要设置,则用0作为参数。

如果是单纯的只指定一个进入或者离开动画的话,用0作为没有动画的参数可能有问题,这时候需要单独写一个keep动画,例子如下:

1
2
3
4
5
<translate
xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="动画时长"
android:fromYDelta="0"
android:toYDelta="0"/>

Fragment 转场动画

  • 标准的转场动画

可以给Fragment指定标准的转场动画,通过setTransition(int transit)方法。

该方法可传入的三个参数是:

TRANSIT_NONE(没有动画)

TRANSIT_FRAGMENT_OPEN(打开动画)

TRANSIT_FRAGMENT_CLOSE(关闭动画)

TRANSIT_FRAGMENT_FADE(淡入淡出动画)

  • 自定义动画

自定义转场动画是通过setCustomAnimations()方法,因为Fragment添加时可以指定加入到Back Stack中,所以转场动画有添加、移除、从Back stackpop出来,还有进入四种情况。

注意setCustomAnimations()方法必须在addremovereplace调用之前被设置,否则不起作用。此外,不管是自定义动画还是标准动画对于hideshow都会起作用。

自定义动画氛围两种情况,一种是不使用V4包的情况下动画是属性动画,使用V4包的时候动画是普通的View动画。

自定义动画有两个方法,分别是

setCustomAnimations(int enter, int exit, int popEnter, int popExit)
setCustomAnimations(int enter, int exit)

enter-Fragment打开的动画,主要是对于新加进来的Fragment执行动画。

exit-Fragment退出动画,主要是对于关闭Fragment执行动画。需要注意的是当调用replace的时候,前一个Fragment也会执行退出动画。

popEnter-当调用addToBackStack()方法后,当前的Fragment退出返回上一个Fragment,上一个Fragment就是popEnter,这时候它就会执行这个动画。这个动画对于新创建的Fragment无效。

popExit-当前Fragmentback stack中,并且出栈的时候会执行popExit动画。

对于使用属性动画的Fragment,动画资源需要放到res/animator目录下。使用View动画的,动画资源直接放到res/anim下就可以。

事例

  • 使用自定义动画
1
2
3
4
5
getSupportFragmentManager().beginTransaction()
.setCustomAnimations(R.anim.slide_in_from_bottom, 0, 0, R.anim.slide_out_to_bottom)
.replace(getFragmentId(), fragment, fragment.getClass().getSimpleName())
.addToBackStack(fragment.getClass().getSimpleName())
.commit();
  • 使用标准动画
1
2
3
4
5
getSupportFragmentManager().beginTransaction()
.replace(getFragmentId(), fragment,fragment.getClass().getSimpleName())
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE)
.addToBackStack(fragment.getClass().getSimpleName())
.commit();

参考

Android Activity和Fragment的转场动画