发布网友 发布时间:2023-05-01 13:51
共1个回答
热心网友 时间:2023-11-03 04:55
Android WMS动画系统初探(一)
Android WMS动画系统初探(二)
Android WMS动画系统初探(三)
Android中动画的工作过程:在某一个时间点,调用getTransformation(),根据mStartTime和mDuration,计算出当前的进度,在根据mInterpolator计算出转换的进度,然后计算出属性的当前值,保存在matrix中。
再调用Matrix.getValues将属性值取出,运用在动画目标上。
[图片上传失败...(image-8c5ae5-1636101404926)]
Animation
在给定了初始状态、结束状态、启动时间与持续时间后,可以为使用者计算其动画目标在任意时刻的变换(Transformation)
Transformation
描述了一个变换,包含两个分量:透明度和一个二维变换矩阵
无论APP或者系统,都是可以直接向Choreographer注册FrameCallback来实现动画驱动的。
Choreographer 类似 Handler,处理回调的时机为屏幕的垂直同步(VSync)事件到来之时,其处理回调的过程被当作渲染下一帧的工作的一部分
postCallback(int callbackType, Runnable action, Object token)
postCallbackDelayed(int callbackType, Runnable action, Object token, delayMillis)
postFrameCallback(FrameCallback callback)
对于View动画,动画的目标就是View,而对于窗口来说,动画的目标其实都是Surface,对不同层级的SurfaceControl进行操纵,会产生不同的动画效果。
[图片上传失败...(image-b25ef9-1636101404926)]
如上图 WMS的结构层次可以简单概括为:
RootWindowContainer -> DisplayContent -> DisplayArea -> Task -> WindowToken -> WindowState
[图片上传失败...(image-2bdd8a-1636101404926)]
根据操纵层级的不同我把动画分类为:窗口动画、过渡动画、Task动画、全屏动画等等
[图片上传失败...(image-d5ed20-1636101404926)]
在窗口布局(relayout)阶段调用到
WindowStateAnimator#commitFinishDrawingLocked ->
WindowState#performShowLocked ->
WindowStateAnimator#applyEnterAnimationLocked
开启窗口动画流程
frameworks/base/services/core/java/com/android/server/wm/WindowContainer.java中定义了一个mSurfaceAnimator成员变量
SurfaceAnimator的startAnimation方法中创建Leash,可以通过SurfaceAnimator的类注释了解Leash
为什么引入Leash可以参考此文: Android P——LockFreeAnimation
mAnimation.startAnimation这一步最终会通过LocalAnimationAdapter找到WMS里的SurfaceAnimationRunner进行执行。
这是 WindowContainer与SurfaceAnimtor、SurfaceAnimationRunner的持有关系 :
[图片上传失败...(image-f741c0-1636101404926)]
往编舞者上抛的runnable是执行startAnimations方法
SurfaceAnimationRunner#startAnimations ->
SurfaceAnimationRunner#startPendingAnimationsLocked
会从mPendingAnimations遍历RunningAnimation并执行startAnimationLocked
这一步构建了一个SfValueAnimator来真正的驱动动画,每一帧的处理是通过WindowAnimationSpec构建真正要执行的动画事务,然后使用mChoreographer.postCallback在下一个vsync信号到来时提交动画事务。
ValueAnimator驱动动画的原理本文就不做深入了。
下一篇文章我将进一步分析Activiy的过渡动画和屏幕旋转动画的相关流程。
Android WMS动画系统初探(二)
Android WMS动画系统初探(三)