本文是android窗口管理系列文章之一。
下面这篇文章介绍了 wms是如何计算activity窗口大小的。写的很详细清晰。
http://blog.csdn.net/luoshengyang/article/details/8479101
这篇文章简化了上面的文章,方便快速的理解。我秉承这样的观点,
我们应该尽量强调是什么?做什么用的?其次才是过程。过程容易遗忘,只有内在的联系可以记住。
当说明是什么的时候,我们应该尽量避免大篇幅的贴代码。代码更倾向于说明流程,而不是本质。
首先说明一下,为什么需要wms来计算activity 窗口的大小?客户端代码不能自己计算么?客户端在作图过程中,
不是有measure, layout, draw的三部曲么?
理由是这样的,
WindowManagerService服务会根据屏幕及其装饰区的大小来决定Activity窗口的大小。
一个Activity窗口只有知道自己的大小之后,才能对它里面的UI元素进行测量、布局以及绘制
activity窗口可能不能占据整个的屏幕,例如它上面可能有status bar, 下面可能弹出输入法窗口,更进一步的,有些ui的左边
有一个导航栏。在计算的过程中,需要减掉这些边衬区域,得到activity的窗口大小。这个大小,再传递给客户端,进行Measure的过程。
客户端measue的过程,拿到了父窗口的大小,计算子view的大小。子view的大小,不能超越父亲的大小。当子view的大小计算完毕
之后,就会调用layout的过程进行布局。布局完毕之后,才进行作图。
客户端performTravsersal会调用relayoutwindow。该函数请求WindowManagerService服务计算Activity窗口的大小以及边衬大小。
计算完毕之后,Activity窗口的大小就会保存在ViewRoot类的成员变量mWinFrame中,而Activity窗口的内容区域边衬大小和可见区域边衬大小分别保存在ViewRoot类的成员变量mPendingContentInsets和mPendingVisibleInsets中。
在上面的分析中,我们已经对大小计算过程,有了一个概括的了解。下面,更细节的介绍relayoutwindow过程。