转载请注明出处:http://blog.youkuaiyun.com/wl9739/article/details/52833668
Android 中的动画有很多,除了在一个界面上使用帧动画、属性动画将一个或多个 View 进行动画处理以外,还可以用于两个界面之间过渡、跳转。在 Android 5.0 之前,我们已经有了 overridePendingTransition() 方法来实现一些转场效果。然而,在 Android 5.0 以后,转场效果更加炫酷。 比如下面的动画:
本篇文章,主要就是解说如何实现上述的效果。主要内容包括:
- Android 5.0+ 的转场动画
- Android 4.X 模拟实现 Android 5.0+ 转场效果。
Android 5.0+ 中的转场动画
实现转场动画只需三步:
- 在 res/ 目录下创建 transition 文件夹,在该文件夹下定义界面转场动画和共享元素的动画。
- 在 res/value/style 文件中为每个 Activity 指定转场动画的 style ,并在
AndroidManifest.xml
文件中为每个 Activity 设置对应的 android:theme。 - 在 Activity 调用 startActivity() 切换动画前,使用 ActivityOptionsCompat 来创建转场动画时的共享对象。
下面就来对这三步进行详细讲解。
定义转场动画
在 res/ 目录下创建了 transition 资源文件夹后,就可以在该文件夹下对每一种动画进行定义。
一般来说,对 Activity 定义一个过渡动画可以写成下面的形式:
<explode xmlns:android="http://schemas.android.com/apk/res/android">
<targets>
<target android:excludeId="@android:id/statusBarBackground"/>
<target android:excludeId="@android:id/navigationBarBackground"/>
</targets>
</explode>
其中,<explode/>
是动画效果的名称,Android 5.0(API 级别 21)支持这些进入与退出转换:
- 分解(explode):从场景中心移入或移出视图。
- 滑动(slide):从场景边缘移入或移出视图。
- 淡入淡出(fade):通过调整透明度在场景中增添或移除视图。
而每一种动画效果,都有额外的属性。比如滑动 slide,可以使用 android:slideEdge="top"
设置滑动的方向;淡入淡出(fade)可以使用 android:fadingMode="fade_in"
设置具体是淡入(fade_in)还是淡出(fade_out)等。
<targets/>
标签里面定义需要转场(或者不需要转场)的目标 id ,这个 id 可以使系统自带的,也可以是我们自己视图中的 view 的 id,每一个 id 需要单独在 <target/>
标签中定义,android:targetId 表示目标 ID 需要进行过渡转换的 view,而 android:excludeId 表示我们不需要该 ID 的 view 进行过渡转场。上面的那段代码的意思是说,除了状态栏和导航栏以外所有的 view,都执行 explode 动画。
如果我们想要在同一个过渡状态中实现两种或多种动画效果怎么办?也简单,将根标签替换为 <transitionSet/>
,然后定义每一种动画效果,最后记得在根标签中使用 android:transitionOrdering
注明这几种动画的演示顺序,sequential
表示顺序执行,而 together
表示同时执行。比如像下面的代码:
<transitionSet