我在項(xiàng)目中臉球這個項(xiàng)目中的話我是用自定義View完成了一個下拉選擇切換城市的一個控件.實(shí)現(xiàn)自定義View的話我們要進(jìn)行計(jì)算然后布局?jǐn)[放然后再繪制出來
首先我們進(jìn)行計(jì)算我們先走onMeasure()這個方法調(diào)用了setMeasureDimension()通過測量父窗體的模式和對我們的寬高進(jìn)行重新繪制,給我們View重新替換最新的寬高,然后調(diào)用
setMeasureDimensionRaw()這個方法將我們最新的寬高賦值給我們當(dāng)前類的寬高.然后我們再去進(jìn)行布局?jǐn)[放,首先還是要通過onMeasure進(jìn)行測量 然后將獲取到的距離代替以前的距離,
然后通過setFrame()方法進(jìn)行判斷如果原來的值與現(xiàn)在的值有一個不同就會發(fā)生改變,然后再測量出最新的寬高與之前的寬高作比較,如果有一個不一樣就說明它的尺寸發(fā)生了改變他就會走
invalidate(sizeChanged)這個方法,這個方法的作用就是用來重新繪制的,然后再通過setLeftTopRightBottom()設(shè)置頂點(diǎn),再通過sizeChanged()這個方法來調(diào)整尺寸.接著我們就去
繪制,我們主要使用onDraw()和dispatchDraw()這兩個方法,發(fā)現(xiàn)這兩個方法是空方法需要我們覆寫,我們點(diǎn)進(jìn)ViewGroup的dispatchDraw()這個方法,發(fā)現(xiàn)里面有一個childer這個數(shù)組
我們通過getAndVerifyPreorderedView這個方法獲取一個child,然后會調(diào)用drawChild()這個方法,這個方法里面會通過child.draw()去繪制子View onDraw()也是一樣的.