android之自定義View和ViewGroup(二)(此篇不講述代碼,只講述原理和結構,帶你走進自定義的世界)

在上一篇文章android之自定義View和ViewGroup分析(一)中,

已經講過了關於自定義View的實現原理以及實現步驟和相關的方法分析,所以這篇就不講自定義View了,講講自定義ViewGroup,爲了以後自己也方便回憶知識,就寫下這一篇做個記錄吧,也給大家一個參考,最近寫博客都是想過想好之後纔開始寫的,所以不會坑大家的,哈哈。


上篇講過自定義View主要是重寫兩個步驟:測量大小(onMeasure方法),繪製(onDraw方法),先測量出需要的大小,然後根據需要的大小畫在指定的位置。
對於ViewGroup,其實也是一樣的,先測量大小,測量什麼大小呢?遍歷子View然後調用他們自己的測量方法測量子View的大小,然後再根據子View的大小測量出自己的大小並通過setMeasuredDimension方法設置(注意:也要分測量模式的,測量模式在上篇自定義View已經說過了)。大小測量完成後,再調用onLayout方法來設置子View的位置,比如LinearLayout的orientation如果設置爲horizontal表示橫向佈局,那麼在onLayout方法裏面就會根據將子View橫着一個一個地放置,至於大小再onMearsure方法裏面已經測量了子View的大小根據margin之類的確定了大小,所以只需要在onLayout中確定子View的放置位置就行了。有人可能就會問了,畫呢?自定義View測好了之後就進行繪製,ViewGroup不需要繪製嗎?任何看見的都需要繪製!不繪製你特麼怎麼顯示出來,這個時候就不是onDraw方法進行繪製了,大家知道onDraw方法是對自己的屬性進行繪製,所以除非你要對ViewGoup自己的顏色背景之類的進行自定義就可以調用onDraw了,否則只需要調用dispatchDraw方法進行繪製子View,而自定義的時候此方法不需要咋們自己重寫設置了,因爲ViewGroup會自己調用。


說白了,自定義ViewGroup就是:測量大小,設置子View位置。這樣就夠了,繪製子View不需要咋們自己繪製了。那麼我們來看看相關方法:

首先,onMeasure方法:

@Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }
細心就會發現跟自定義View的onMeasure方法一模一樣,沒錯,是一樣的,都是兩個參數,還記得自定義View的時候也是這兩個參數吧,測量子View大小的時候就是調用measureChild()方法將ViewGoup的這兩個widthMeasureSpec和heightMeasureSpec參數傳遞進去給子View,查看源碼你會發現其實measureChild方法裏面調用了childView的meansure方法即:

child.measure(childWidthMeasureSpec, childHeightMeasureSpec);

,這個方法就是傳遞並設置view的測量模式。使用for循環遍歷子View,然後測量子View大小,這就是ViewGroup的onMeasure方法的作用,具體實現我就不多說了。本篇是不講代碼的,只說實現邏輯,代碼案例會在後面補上。

然後onLayout方法:

@Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        super.onLayout(changed, l, t, r, b);
    }
一共有5個參數,第一個是代表當前ViewGroup是否發生改變,後面4個參數依次表示,左上右下,即距離父層的左上右下距離。這幾個參數沒多大用,遍歷設置子View的位置時很少用到,一般都是根據需求設置他們的位置,總之,遍歷子View然後設置子View的位置就是在此方法中執行的,具體怎麼執行的,代碼我會在後期案例中進行實現和說明。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章