在Android 4.4 Transition 就已经引入了,但在Android 5.0(API 21)之后,Transition 被更多的应用起来。相对于View Animation或Property Animator,Transition动画更加具有特殊性,Transition可以看作对Property Animator的高度封装。不同于Animator,Transition动画具有视觉连续性的场景切换。
为了对Transition有一个大概的了解,我们通过:Scene Transition(场景过渡动画)、Activity过渡动画、Shared Element Transition(共享元素过渡动画)这三个方面来做一个简单的了解。
一、Scene Transition(场景过渡动画)
场景过渡动画是指以动画的形式实现View两个场景的切换(从一个场景切换到另一个场景)。而且在切换过程中通过Transition来设置不同的过渡动画效果。
场景过渡动画中有两个特别关键概念:Scene(场景),Transition(过渡)。
- Scene:Scene代表一个场景。Scene保存了一个视图层级结构,包括它所有的views以及views的状态,通常由getSceneForLayout (ViewGroup sceneRoot,int layoutId,Context context)获取Scene实例。Transition框架可以实现在starting scene和ending scene之间执行动画。而且大多数情况下,我们不需要创建starting scene,因为starting scene通常由当前UI状态决定,我们只需要创建ending scene。
- Transition:Transiton则是用来设置过渡动画效果用的。而且系统给提供了一些非常使用的Transtion动画效果,如下表所示:
系统Transition | 解释 |
---|---|
ChangeBounds | 检测View的位置边界创建移动和缩放动画(关注布局边界的变化) |
ChangeTransform | 检测View的scale和rotation创建缩放和旋转动画(关注scale和ratation的变化) |
ChangeClipBounds | 检测View的剪切区域的位置边界,和ChangeBounds类似。不过ChangeBounds针对的是view而ChangeClipBounds针对的是view的剪切区域setClipBound(Rect rect) 中的rect(关注的是setClipBounds(Rect rect)rect的变化) |
ChangeImageTransform | 检测ImageView的ScaleType,并创建相应动画(关注的是ImageView的scaleType) |
Fade | 根据View的visibility状态的的不同创建淡入淡动画,调整的是透明度(关注的是View的visibility的状态) |
Slide | 根据View的visibility状态的的不同创建滑动动画(关注的是View的visibility的状态) |
Explode | 根据View的visibility状态的的不同创建分解动画(关注的是View的visibility的状态) |
AutoTransition | 默认动画,ChangeBounds、Fade动画的集合 |
要想实现一个场景过渡动画,至少需要一个transition实例和一个ending scene实例。并通过TransitionManager执行过渡动画。TransitionManager执行动画有两种方式:TransitionManager.go()、beginDelayedTransition()。下面简单来介绍下这两种开启场景动画的方式。
1.1、TransitionManager.go()开启场景动画
用说TransitionManager.go()实现场景动画之前,先上效果图
![]()
TransitionManager.go()需要两个参数:第一个参数代表要过渡到的场景(end scene)、第二个参数过渡动画(transition 实例)。
TransitionManager.go()启动动画的时候,场景一般通过布局文件给出。场景实例的获取则通过Scene.getSceneForLayout()来获取,需要三个参数:第一个参数代表场景所在的ViewGroup、第二个参数代表场景布局文件、第三个参数布局文件转换View所需要的Content。
TransitionManager.go()的场景是通过布局文件指定。
1.2、beginDelayedTransition()开启场景动画
用beginDelayedTransition()实现场景动画的效果图
![]()
通过TransitionManager.beginDelayedTransition()也可以开启场景动画。在执行TransitionManager.beginDelayedTransition()之后,系统会保存一个当前视图树状态的场景,之后当我们改变了View的属性之后(比如重新设置了View位置、缩放、clipe等等)。在下一次绘制时,系统会自动对比之前保存的视图树,然后执行相应动画。
二、Activity过渡动画
2.1、API 21之前Activity过渡动画使用
API21之前Activity过渡动画通过两种方式来实现:style主题里面统一设置、或者使用代码overridePendingTransition函数单独设置。(当然了代码设置的优先级要高于style主题里面统一设置)
- style文件主题里面统一定义,全局为所有Activity设置过渡动画效果。
<item name="android:windowAnimationStyle">@style/Animation.Activity.Customer</item>
- 1
<style name="Animation.Activity.Customer" parent=