天天看點

Android Layout inflate分析(2) - ViewGroup對象的構造UI控件

viewgroup實作了viewmanager和viewparent兩個接口。

在inflate的過程中,主要用到的是構造和addview。第一個view參數不用說了,要加入的子view。另外一個重要的參數是viewgroup.layoutparams. 這個參數的主要用途是指定子view的位置。

作為一個基本類,它的主要作用是指定子view的寬和高。

除了直接指定大小之外,它還接受兩個值:match_parent(老的名字叫fill_parent)和wrap_content. 這大家都太熟悉了,就不多說了。

下面抽象一下,常量和寬高,是我們熟悉的部分。

下面是布局動畫的,先放在這裡,用到再說。

别看下面都是又是主題,又是繞來繞去的高大上方法。本質上,viewgroup.layoutparams就是寬和高兩個域。這兩個值賦正确了,其它的就都不用管。值可以是具體的pixel值,也可以是match_parent或者wrap_content兩個常量。

我們把代碼中的幾個構造方法的順序調整一下,先看說人話的。

第一個是最正宗的指派型構造,兩個值一賦就ok。

再看下拷貝構造方法:

然後再看說文言的,這個得轉幾道手,看幾個其它類的方法:

首先來看這個context.obtainstyledattributes,從主題中讀取值。先擷取目前上下文的主題,然後調用主題類的obtainstyledattributes.

我們移步/frameworks/base/core/java/android/content/res/resources.java,看看theme中的obtainstyledattributes的實作,我們删節一下,一共也沒幾句邏輯:

然後我們轉戰typedarray.obtain:

得到了typedarray結果之後,再通過setbaseattributes将值設定好。上面已經反複強調了,在viewgroup.layoutparams一共就隻有寬和高兩個參數,不管怎麼複雜地折騰,最終落實的一定是這兩個值。

viewgroup.layoutparams隻有寬和高兩個參數,簡單是極簡了。下面我們給它周圍加個白邊。一共6個變量,上下左右4個邊距,加上起始和結束2個邊距。

前三個都是陪太子讀書的,一共是4個參數,前三個是給1個參數,2個參數,3個參數時其它給空參數時的調用。

其餘就下面這一個,它一共有3步,我們分别分析。

這個好,基本上都是設一些屬性

又到了我們熟悉的context.obtainstyledattributes,下面就是分門别類放東西,就不多說了。

這個類又是一個要求uithread的類.

view類的構造方法,就是被viewgroup類用super調用的那個,我們省略一些細節,看看它的結構:

我們把細節省略掉之後,跟viewgroup剛才我們看到的構造函數已經非常像了。還是擷取一個typedarray對象,然後分門别類處理這些屬性。

繼續閱讀