通过启动窗口为例子,大致上明白了WMS是如何添加,更新,移除窗口的工作原理。本文将会重点聊一聊窗口的大小计算逻辑。
// 当全屏的时候,设置内容区域就是父亲区域,显示屏区域就是传进来的显示屏区域,并且窗体没有位移
实际上这一段就是根据刘海屏幕的处理区间,最后调用computeFrameLw设置区域。接下来的逻辑在上面已经聊过了。
测量那些绑定了父窗口的窗口
实际上这里的逻辑和上面很相似,不过走的是attach的逻辑:
则获取比较子内容区域和mContent更大取哪个
显示,过扫描,可见区域 = 父(被父窗体限制)
对整个屏幕做了初步的测量,把剩下的Window都限定到了statusBar 之下。不允许任何窗体遮挡它。
测量所有窗体的显示屏区域,过扫描区域,父区域,内容区域,可见区域。
这两个标志位确定了窗口能够移动的最大范围。
内容区域,是被adjustResize标志位确定。如果是打开则是内容区域的范围。因为这个标志是处理了Activity调整空间给键盘腾出空间。如果是关闭,打开layoutInScreen则内容区域为mDock,否则内容区域为mContent,或者根据标志为走。
可视区域,是由adjustNothing确定,如果打开了可视区域就等于内容区域,关闭了则内容区域为mCurrent(内容带上键盘),任由系统自己默认适配。
这就是WMS的最后一篇,实际上还有窗体动画以及Surface如何管理没有讲解。但是还没有涉及到SurfaceFlinger是如何工作的,View的绘制流程又是如何。接下来,将会以这个为突破口,和大家聊聊SurfaceFlinger的核心原理。不过,还需要点其他知识,除了OpenGL之外,还需要Skia相关的知识。
跟着我看OpenGL的朋友应该没有多少问题,如果对OpenGL感兴趣的可以看看我的OpenGL的学习日记。之后我还会放出几篇关于Skia的学习笔记。