1.什么是布局過程
布局是計(jì)算控件大小和位置的過程。
布局過程分為兩個(gè)階段
- 測(cè)量階段
根據(jù)子控件的大小和ViewGroup自身的布局規(guī)則刽射,確定ViewGroup自身的大小 - 布局階段
根據(jù)子控件大小和自身的布局規(guī)則翩活,確定子控件的位置
2.測(cè)量和布局階段原理總覽
image.png
3.測(cè)量階段的原理細(xì)講
父容器在onMeasure方法中先測(cè)量出child的尺寸务冕,然后再測(cè)量出自己的尺寸
以AbsoluteLayout為例
-
調(diào)用ViewGroup.measureChildren()測(cè)量所有child的尺寸
測(cè)量好后child會(huì)調(diào)用setMeasuredDimension保存測(cè)量的尺寸蠢棱,
然后可以通過child的view.getMeasuredWidth獲取測(cè)量的尺寸笆凌。ViewGroup.getChildMeasureSpec函數(shù)很關(guān)鍵(承上啟下的作用)
getChildMeasureSpec(int spec, int padding, int childDimension)
根據(jù)ViewGroup的parentWidthMeasureSpec盗誊,Child的widthMeasureSpec計(jì)出Child的最終的widthMeasureSpe 根據(jù)child測(cè)量得到的尺寸計(jì)算得到AbsoluteLayout最大的尺寸
根據(jù)計(jì)算得到的maxWidth,自己的withMeasureSpec,得到自己的尺寸时甚,并保存隘弊。
image.png
4. 要重寫onMeausre的一些情況
- 對(duì)高寬有特殊的要求,比如:要求高一定要和寬一樣大
- 繼承View的視圖中要繪制多個(gè)內(nèi)容
如下荒适,自定義的View繼承View梨熙,并且要繪制一個(gè)圖片和文字,這是需要重寫onMeasure,
- 自定義視圖的寬=Bitmap.widh+文字.width
-
自定義視圖的高=max(Bitmap.height,文字.height)
image.png
5.總結(jié)
- 尺寸由尺寸模式和尺寸大小組成?
因?yàn)榭丶某叽绱笮〔皇怯勺约簺Q定的刀诬,還要考慮到父容器的大小咽扇。- AT_MOST 控件最大大小不能超過指定大小
- EXACTLY 控件大小為指定的大小
- UNSPECIAl 不對(duì)控件大小進(jìn)行約束
- 調(diào)用ViewGroup.measureChildren()測(cè)量所有child的尺寸 ,
然后child會(huì)調(diào)用view.setMeasuredDimension保存測(cè)量的尺寸,
然后通過child的view.getMeasuredWidth獲取測(cè)量的尺寸陕壹。 - ViewGroup.getChildMeasureSpec函數(shù)很關(guān)鍵
getChildMeasureSpec(int spec, int padding, int childDimension)
根據(jù)ViewGroup的parentWidthMeasureSpec质欲,Child的widthMeasureSpec計(jì)出Child的最終的widthMeasureSpec - 如果想手動(dòng)測(cè)量某個(gè)View的尺寸
調(diào)用View.measure()方法