View ViewGroup的測量 布局 繪製流程

2021-07-25 06:58:42 字數 2490 閱讀 1715

注:

1、為了方便描述,假定現在有三層布局,分別為:最外層view1、第二層view2、第三層view3;

2、下面「測量子控制項、布局子控制項、繪製子控制項」的思路都是:用for迴圈遍歷子控制項,呼叫子控制項的measure()、layout()、draw()方法。下面就不對此進行解釋。

measure(int widthmeasurespec, int heightmeasurespec){}

1、該方法在view類中,所有子類都是呼叫這個方法;

2、引數是自身的measurespec,由父控制項計算後傳遞過來;

3、該方法做2件事:

①計算出最終的measurespec;

②呼叫自身的onmeasure()方法,將measurespec傳遞過去;

onmeasure(int widthmeasurespec, int heightmeasurespec){}

1、該方法由每個控制項自己重寫,因為不同控制項測量規則不一樣;

2、該方法做2件事:

①呼叫measurechildren()方法測量子控制項;

②計算自身尺寸值(子控制項測量完畢後,才能確定自身尺寸);

measurechildren(){}

1、該方法在viewgroup類中,所有viewgroup子類都呼叫這個方法;

2、該方法測量子控制項;

測量流程總結:view1.measure()——view1.onmeasure()——view1.measurechiledren()——view2.measure()——view2.onmeasure()——view2.measurechiledren()——view3.measure()——view3.onmeasure()——view3.measurechiledren()

所謂布局,就是確定控制項的位置,即確定其上下左右座標值

layout(int l, int t, int r, int b){}

1、該方法在view類中,所有子類都是呼叫這個方法(不同控制項,在調這個方法之前會進行一些其它處理);

2、引數是自身的上下左右座標值,由父控計算後件傳遞過來;

3、該方法做2件事:

①設定自身上下左右座標值;

②呼叫自身的onlayout()方法對子控制項進行布局;

onlayout(boolean changed, int left, int top, int right, int bottom){}

1、該方法由每個具體類自己重寫,因為不同的控制項,布局規則不一樣;

2、該方法布局子控制項;

布局流程總結:view1.layout()——view1.onlayout()——view2.layout()——view2.onlayout()——view3.layout()——view3.onlayout()

draw(canvas canvas){}

1、該方法在view類中,所有子類都是呼叫這個方法;

2、引數canvas在所有控制項中傳遞,即該布局中的所有子控制項都用同乙個canvas;

2、這個方法中啟動繪製流程(下面為簡化流程):一些初始化計算——繪製背景——ondraw()繪製自身——dispatchdraw()繪製子控制項;

ondraw(canvas canvas){}

1、該方法在view類中是空實現,所有具體控制項具體實現;

2、該方法繪製自身;

dispatchdraw(canvas canvas){}

1、該方法在viewgroup類中,所有子類都是呼叫這個方法;

3、該方法繪製子控制項;

繪製流程總結:view1.draw()——view1.ondraw()——view1.dispatchdraw()——view2.draw()——view2.ondraw()——view2.dispatchdraw()——view3.draw()——view3.ondraw()——view3.dispatchdraw()

1、這三個流程都是在viewroot中啟動,啟動方法分別為performmeasure()、performlayout()、performdraw();

2、measure()、layout()、draw()是啟動流程,沒有各個控制項專屬的東西,所以在基類view中,子類共用**;

3、onmeasure()、onlayout()、ondraw()是具體的測量、布局、繪製工作,各個控制項不一樣,所以各個控制項自己實現;

4、measurechildren()、dispatchdraw()的作用是:遍歷子控制項、呼叫其measure()/draw()方法。沒有各個控制項專屬的東西,所以在父類viewgroup中,子類共用**;

5、布局是個例外,沒有layoutchildren()方法,因為每個控制項布局規則不一樣,無法重用**,所以「布局子控制項」放在onlayout()方法中實現;

view viewGroup 呼叫順序

view onmeasure 0 0 view onmeasure 0 0 viewgroup onmeasure 0 0 view onmeasure 0 0 view onmeasure 0 0 viewgroup onmeasure 0 0 viewgroup onsizechanged 10...

自定義View ViewGroup流程

一 自定義view 1.onmeasure int widthmeasurespec,int heightmeasurespec int wspecmode measurespec.getmode widthmeasurespec int wspecsize measurespec.getsize ...

Drbd heartbeat mysql的測試報告

一 原因分析 1 目前架構分析圖 2 原因分析 由於平台業務網路不穩定,drbd的心跳指向閘道器題導,在網路出現問題導致腦裂,出現腦裂有兩種結果 1 共享資源被瓜分 兩邊 服務 都起不來了 2 兩邊 服務 都起來了,但同時讀寫 共享儲存 導致資料損壞 3 導致腦裂發生的原因 1 高可用伺服器之間心跳...