UI不好,工作難保!自定義View是Android程序員的分水嶺?安卓開發(fā)升職加

ViewGroup的【生命周期流程】:


Q:為什么有些方法會被調(diào)用多次?
A:我個人理解因為對于一個ViewGroup進行measure的時候,一個View的大小依賴于measure子View和父View的measureSpec,所以一個View的onLayout onMeasure方法會被調(diào)用多次。
課程1自定義FlowLayout:
自定義FlowLayout其實就是自定義一個ViewGroup,我們關(guān)注的點主要在onMeasure和onLayout:

onMeasure部分
- 測量的關(guān)系,ViewGroup在進行measure時,需根據(jù)子View的大小調(diào)整自身。
- 在ViewGroup中onMeasure時,不能直接將從上面?zhèn)飨碌膍easureSpec傳給子View。
- onMeasure的過程:
- 度量孩子 -> for 孩子的height width,通過getChildMeasureSpec方法設(shè)置正確的measurespec,然后重新measure
- 度量自己 -> setMeasureDimension(),和自身的功能相關(guān),并且最后需要根據(jù)MeasureSpec調(diào)整

onLayout部分
坐標系

onLayout的四個參數(shù),都是參考ViewGroup(圖二)

4. 在后續(xù)的layout measure過程中可能會改變的變量需要注意避免在構(gòu)造函數(shù)中初始化,因為構(gòu)造函數(shù)只會調(diào)用一次,measure layout會調(diào)用多次。
5 . measure過程還是需要注意使用getChildMeasureSpec,同時注意view inflate的問題:

LayoutInflater.inflate(res, parent, false),如果不是這樣會導(dǎo)致,根View(temp)無法執(zhí)行setLayoutParams,這樣child.getLayoutParams也會出問題。
面試問題總結(jié):
Q1:MeasureSpec和LayoutParams之間有關(guān)聯(lián)嗎?為什么有了LayoutParams還需要MeasureSpec?
View在xml中通過使用android:layout_width等方式告訴父容器布局方式(其實是LayoutParams的xml屬性),LayoutParams+父布局決定了MeasureSpec。

Q2:如何將xml中的定義轉(zhuǎn)變成MeasureSpec?

使用getChildMeasureSpec,getChildMeasureSpec在任主席的《安卓開發(fā)藝術(shù)探索》中有總結(jié)。其中第二個參數(shù)padding來自parent ,第一個參數(shù)是父親的MeasureSpec,最后一個是子需要的大小。


Q3:為什么需要measure
