標籤:
Measure的本質是:把試圖布局時的相對值轉化為具體值。
MeasureSpec類封裝了從parent傳遞下來的布局要求,每一個MeasureSpec代表了對寬度和高度的一個要求。
為什麼布局需要父視圖與子視圖共同決定? 為什麼不直接設定寬和高? 如果不這樣就像HTML那樣指定固定大小,這樣會造成一個過大把另外一個擠出去。因為HTML是具有整個頁面的控制權。 而Android是拆分開的,這樣做保證了最末端的(介面開發)影響其他層級的布局,需要按照(控制項開發)的規則來。view.setWidth, view.setHeight ? 不是
需要通過measureChilde(view, width, height), 或者childView.measure();
View.getWidth(), View.getHight()
View.getMeasureWidth(), View.getMeasureHiegh()
一個未添加到視圖中的? 但是有時getMesureHeight 依然是返回0。為什嗎?ec是一個android.view.View的內部類,封裝了從父類傳送到子類的布局要求資訊。
ViewGroup提供的measure方法
measureChildren() - 該函數內使用for()迴圈調用measureChild()對每一個子視圖進行measure操作measureChild() - 為每一個子視圖進行measure操作measureChildWidthMargins() - 該函數與measureChild的唯一區別在於,measure時考慮把margin及padding也作為子視圖大小的一部分
有一個約定:在覆寫onMeasure方法的時候,必須調用 setMeasuredDimension(int,int)來儲存這個View經過測量得到的measured width and height。如果沒有這樣做。將會由measure(int, int)方法拋出一個IllegalStateException。
measure(int widthMeasureSpec, int heightMeasureSpec),由於圖片都是正方形,所以寬和高的值是一樣的。
覆寫onMeasure方法的時候,子類有責任確保measured height width至少為這個View的最小height和width。
setMeasuredDimension(resWidth, resHeight);
根據設定的圖的尺寸,擷取此控制項的最小可用值(如果設定了android:minwidth)
如果沒有背景圖,那麼取預設的尺寸,預設其實就是螢幕寬和高中的小值
Android--自訂ViewGroup()