Android WMS动画系统初探(一)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android WMS动画系统初探(一)相关的知识,希望对你有一定的参考价值。

参考技术A

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动画系统初探(三)

如何在 mapbox 中为 Geoserver 图层设置动画?

【中文标题】如何在 mapbox 中为 Geoserver 图层设置动画?【英文标题】:How to animate a Geoserver layer in mapbox? 【发布时间】:2020-03-04 11:02:27 【问题描述】:

我在我的 Android 应用上使用 Mapbox SDK,我想显示来自我的地理服务器的图层。

我选择了 WMS 格式并且效果很好。

下一步是通过提供每 X 秒滴答一次的时间属性并更新图层图块,为该图层设置动画以显示延时。 WMS 支持 time 属性来请求特定时间的 TileSet,但我不知道如何在 MapBox 中设置该时间并更新地图 TileSet。 示例是经典的天气应用程序。

如果 WMS 不是正确的选择,我可以选择其他格式,如果 geoserver 支持的话。

【问题讨论】:

【参考方案1】:

有几种不同的方法可以使用 Mapbox Maps SDK for Android 为地理参考图像制作动画。一种是使用ImageSource(允许在地图上显示地理参考光栅图像),然后按照this example 显示时间流逝。

要继续使用 WMS 框架,您可以使用 this example 来显示 WMS 源代码(听起来您已经成功完成了)。 Mapbox Maps SDK for Android 没有用于及时表示更新的底层机制,但您可以查询您的 GeoServer 并将结果与​​Runnable 结合使用,类似于我链接的第一个示例中的RefreshImageRunnable

【讨论】:

以上是关于Android WMS动画系统初探(一)的主要内容,如果未能解决你的问题,请参考以下文章

Android 解析WindowManagerService

高效动画实现原理-Jetpack Compose 初探索

android动画详解一 概述

如何在 mapbox 中为 Geoserver 图层设置动画?

android动画详解六 XML中定义动画

android动画具体解释六 XML中定义动画