理解Android的layout和measure

在Android UI開發中,總會有情況需要自定義View和View Group. 

什麼是View?就是Android中一個基本視圖單位,一個Button是一個view, 一個Layout, 也是一個View

什麼是ViewGroup, ViewGroup本身也是一種View. 但是ViewGroup能夠包含子View. 可以理解為ViewGroup往往是一個容器。比如說LinearLayout, FrameLayout就是屬於ViewGroup.

 

measure和layout是非常重要的兩個概念

 

measure設置view的大小,如果有child view, 循環調用其measure函數

layout擺放child view的位置

 

舉一個例子,我需要在程序中顯示一個頁面A, 該頁面包括兩個子view A1, A2. 

那麼我就需要為A創建一個ViewGroup的繼承類。在裡面重寫OnMeasure函數。偽代碼如下:

OnMeasure(){

  設置A自身大小

  A1.measure //調用子view的measure函數

  A2.measure//調用子view的measure函數

}

 

然後重寫OnLayout函數。偽代碼如下:

OnLayout(){

設置A1位置

設置A2位置。

}

 

然後在A1和A2中,重寫OnMeasure函數,設置自身大小

A1:

 OnMeasure{

設置自身大小

}

A2:

 OnMeasure{

設置自身大小

}

 

————————————————————————————————————————————————————————————————————————

但是疑問就來瞭,為毛要這麼麻煩?位置和大小難道不能在xml佈局中就指定嗎?

我隻能回答:擦!我也這樣看

但是安卓的設計師們,心懷天下,一心想幹出個能應對世界無數種尺寸,面對無數種環境,靈活性伸縮性好比小弟弟的UI框架來。於是……

 

比如說,他們認為有一種容器,叫LinearLayout。於是就創造瞭它。 這種神奇的容器,在把子view放入裡面的時候,不需要指定其大小,隻需要說一句:我和俺爹一樣大。於是“啪”,這個字View被貼上一個"Match_parent"標簽

也不需要指定位置。因為你的位置總是接在前面一個子View的後面。

 

哇色!!!!,如果你第一次看到這麼神奇的容器,把東西扔進去不需要指定長寬和位置就直接擺放,覺得真的真的好牛逼哦。

 

但其實不然,一個View如果被放進來,並且標註自身為Match_parent的時候,就會在OnMeasure裡面被一頓計算,因為parent大小總是知道的吧,最大不過屏幕嘛,結合margin和padding,就可以被計算出長寬。關於位置。由於所有View都是順序擺放的,在layout過程中也會結合margin和Padding,給計算出準確的位置。

 

這麼麻煩?繞這麼大個圈?那是不是可以直接指定大小和位置呢? 

No. 大小可以直接指定,位置不可以直接指定。

 

為啥位置不能直接指定?

因為這個是LinearLayout,如果你想隨意指定位置的,用其他的layout嘛,或者你自己自定義嘛

 

= =~,再也不想哇色瞭,我還不如像其他平臺一樣,直接畫一個View出來,往裡面隨便擺放東西,自己指定大小位置。也不分什麼View和ViewGroup瞭。這些偉大的白癡們,精心設計瞭一團復雜無比的垃圾

 

為啥需要measure和layout?為啥不在xml佈局階段就指定大小位置?

別告訴我是為瞭擴展性的需要,

別告訴我是為瞭靈活性的需要,

別告訴我是因為手機屏幕尺寸各式各樣

 

No. 

隻是因為。。。。

把簡單的事情搞復雜,是展現下限的方式

發佈留言