在Android5.0以前,切换Activity或者Fragment时可以通过Activity#overridePendingTransition()或FragmentTransaction#setCustomAnimation()方法增加过场动画,不过效果比较单调,并且只能针对页面中的所有元素,具体使用可参考Android转场动画。
在Android5.0以后,切换Activity或者Fragment时使用过渡动画(Transition Animation),它是Material Design的一部分,能为页面元素在不同状态之间的移动和转换提供视觉切换效果。过渡动画不但能够提供更加丰富的切换效果,并且在进行切换时,排除特定的页面元素不参与动画,以及对两个页面的共享元素设置动画。
Android5.0提供了三种过渡类型:
- Enter Transition:进入过渡,决定Activity&Fragment中的视图如何进入屏幕;
- Exit Transition:退出过渡,决定Activity&Fragment中的视图如何退出屏幕;
- Shared Elements Transition:共享元素过渡,决定两个Activity&Fragment之间的共享视图元素如何转换;
进入和退出效果包括:
- explode:分解,视图从屏幕中间进入或退出;
- slide:滑动,视图从屏幕边缘进入或退出;
- fade:淡出,通过改变视图的透明度,控制视图显示或消失;
共享元素效果包括:
- changeBounds:改变目标视图的布局边界;
- changeClipBounds:裁剪目标视图边界;
- changeTransform:改变目标视图的缩放比例和旋转角度;
- changeImageTransform:改变目标图片的大小和缩放比例;
Enter/Exit Transition 确定了非共享元素如何 进入/退出 页面视图;
Shared Elements Transition 确定了两个页面共享元素的动画效果。
Activity进入和退出动画
通过XML文件设置
- 定义Transition
1 | <?xml version="1.0" encoding="utf-8"?> |
1 | <?xml version="1.0" encoding="utf-8"?> |
- 设置Transition
1 | <style name="BaseAppTheme" parent="android:Theme.Material"> |
通过Java代码设置
- 定义Transition
1 | Explode explode = new Explode(); |
- 设置Transition
在第一个页面中:
1 | // inside your activity (if you did not enable transitions in your theme) |
在第二个页面中:
1 | // inside your activity (if you did not enable transitions in your theme) |
这样可以达到上面XML文件同样的效果,可以看出,使用代码方式相对比较繁琐,不过,代码方式可以为Transition提供更多属性,比如为Transition添加Listener等。
为Activity添加动画
1 | // 第一个页面启动第二个页面 |
1 | // 第二个页面从第一个页面返回 |
Activity共享元素动画
共享元素的过渡动画用于给两个Activity中共享的View添加过渡效果,其使用和进入和退出过的渡动画类似,这里只介绍XML方式添加共享元素过渡动画。
- 定义Transition
1 | <?xml version="1.0" encoding="utf-8"?> |
- 设置Transition
1 | <style name="BaseAppTheme" parent="android:Theme.Material"> |
为两个Activity的layout文件中的共享View添加同样android:transitionName属性
添加过渡动画
1 | ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(this, |
Fragment过渡动画
Fragment的过渡动画使用与Activity基本相同,但是会有一些小区别:
进入和退出效果过渡动画应该在Fragment的.java文件中调用对应的方法或者在xml属性声明里设置。
共享元素的过渡动画应该在Fragment的.java文件中调用对应的方法或者在xml属性声明里设置。
Activity的Transition是通过调用startActivity()和finishAfterTransition()直接启动的,Fragment的Transition是在Fragment被add, remove, attach, detach, show或hidden后由FragmentTransaction自动启动的。
共享元素应该在transaction(事务)提交前调用addSharedElement(View, String)方法,声明为FragmentTransaction的一部分。
参考资料