注:
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 高可用伺服器之間心跳...