Android自定義View和ViewGroup知識點彙總
一、View的繪製流程
onMeasure()->onDraw()。
二、ViewGroup的繪製流程
onMeasure()->onLayout()->onDraw()(一般不重寫)。
三、需要重寫的函式
View:必須重寫onDraw來繪製圖形,不一定要重寫onMeasure,需要定義wrap_content時才需要重寫onMeasure。
ViewGroup:必須重寫onLayout函式,必須重寫onMeasure函式,在onMeasure中必須呼叫measureChildren函式(否則子view佈局中定義的寬高無效)。ViewGroup的onMeasure函式繼承自View,ViewGroup本身沒有呼叫過measureChildren,所以我們必須重寫ViewGroup的onMeasure函式。
四、View的onMeasure作用
獲取父佈局給的寬高Mode和Size,最終呼叫setMeasureDimension(width,height)來設定它自己測量的寬高(並不是最終展示出的寬高)。
五、ViewGroup的onMeasure作用
獲取父佈局給的寬高Mode和Size,最終呼叫setMeasureDimension(width,height)來設定它自己測量的寬高(並不是最終展示出的寬高),同時要呼叫measureChildren函式來測量子View的寬高。
六、ViewGroup的onLayout作用(重點)
這個函式必須重寫,用來定義子View的位置及寬高。需要遍歷子View,依次呼叫子View的layout(l,t,r,b)來進行佈局。其中l表示左邊相對parent的最左邊的距離,t表示頂部相對parent的頂部的距離,r表示最右邊相對parent最左邊的距離,b表示詢問相對parent頂部的距離。即座標系的原點是parent的左上角。一般r=l+getMeasureWidth(),b=t+getMeasuredHeigth()。這個getMeasuredWidth()就是onMeasure函式測量的值,getMeasuredHeigth同理。所以onMeasure函式測量的寬高並不是最終的寬高,View或ViewGroup位置及寬高是由父容器的onLayout函式決定的。
七、getWidth()與getMeasuredWidth()的區別
只有當前View或ViewGroup()的layout()函式被呼叫了之後,getWidth()(getHeigth())才能獲取正確的值。
只有當前View或ViewGroup()的setMeasuredDimenstion()函式被呼叫了之後,getMeasuredWidth()(getMeasuredHeight())才能獲取到正確的值。