对Android Transition好奇,记录追踪代码
Transition是什么?
如图,关注左上角的图块
可以看到,它先改变颜色,后平移到右下角,平移过程中大小也在变化,整体上看就是三个Animator的组合完成; 现在我们看到使用Transition如何实现的
1 |
|
整体上看,依据 statusEnd
定义了两个状态 start,end,而依据这个状态,确定View的 visibility,position,
size,color的属性。
切换状态,并非生硬地切换,而是在切换过程加入针对相关属性的过度动画,我想这就是Android加入这个库的用处吧。
一个页面的两种状态,换个角度,也可以把这两种状态是视为两个页面,切换状态就是切换页面了,这里,我们将变化的页面称之为 Scene
, 变化的过度动画交给
Transition
处理。
Scene
表示一个页面,会绑定到一个实际的View中。作为一个页面,会有进入和弹出两个动作,在这两个动作发生时会执行View 中某些property的动画。
Transition
切换的涵盖了从一个旧的Scene到新的Scene的过程,包括 old scene exit 和 new scene enter.
维护一些动画信息,在Scene变化时执行持有的动画。 主要做两件事:
- capture property value
- play animations based on change to captured property value
还是跟着代码看看吧
先看看上面使用的使用到的 beginDelayedTransition()
感觉注释写得很好了
方法名为意思为 启动一个延迟的切换, 为什么时延迟的呢? 这个切换并没有马上执行,因为一个新的scene还没有确定呢。 而这个新的scene的创建过程也很有意思,它是依据下一帧与当前帧的“变化“确定的,而且它关注的只有参数中sceneRoot的ViewGroup节点下View的变化哦。 本来下一帧要确定好准备绘制的,但是遇到存在Transition未执行,会将其执行玩才真正绘制最终的下一帧。
换个说法,current frame >> next frame 之间,提取出 change in sceneRoot, 为这些 change 执行参数中的transition,即执行动画。 本质上,就是本来要绘制下一帧nextFrame的,发现有transition,则nextFrame要延后,在currentFrame与nextFrame之间插入一系列 的frame,而这些frame由transition来确定。
1 | public static void beginDelayedTransition(@NonNull final ViewGroup sceneRoot, @Nullable Transition transition) { |
那启动一个Activity是如何执行Transition呢?
1 | // options 不为空,默认不传也会获取主题默认的,不过需要当前Window支持 Window.FEATURE_ACTIVITY_TRANSITIONS |