Android graphic: how wms measure the activity window size?

本文是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过程。

 

 

 

 

 

 

 

posted on 2013-09-18 18:02  keniee  阅读(373)  评论(0编辑  收藏  举报