上篇講了自定義view的簡單實現,這章就趁熱打鐵,講講自定義viewgroup的簡單實現。
一、初探
和上篇一樣,看看viewgroup的繪製是什麼走的。
首先可以看到所有的測量和繪製都是在activity的生命週期走之後再走,然後先進行viewgroup的onmeasure,在進行子view的。因為在父viewgroup的onmeasure中寫了
measurechildren(widthmeasurespec, heightmeasurespec);
如果不加這段**,則不會出現子view。詳細的原理還是先不說,但是從這兩個例子你可以知道,寫在xml中的view由系統呼叫完生命週期之後再去繪製,而子view是由父view進行繪製的。
生命週期——父view測量——子view測量——父view擺放子view——繪畫父view ——繪畫子view
二、onmeasure和onlayout這裡就不多講ondraw了,上一章講了,套路都一樣。
1、onmeasure
onmeasure中需要加measurechildren(widthmeasurespec, heightmeasurespec);才能通知子view測量繪畫。如果你做出來,你會發現子view的布局會受父布局的影響。所以這個方法裡有個需要注意的地方,如果你的viewgroup是打算寫死寬高或者match_parent,那當你的子view是固定尺寸時,超過父容器的那部分不會顯示。而如果父布局是wrap_content,那最好測量所以子view的尺寸再設定viewgroup的尺寸,這樣才能實現wrap_content的效果。
那麼這裡就說說如何計算子view的尺寸
view child = this.getchildat(i);
int cw = child.getmeasuredwidth();
這兩行**就能獲取到乙個子view的尺寸,加個迴圈就能獲取到所以子view的尺寸。
@override我這裡做了個例子,viewgroup的寬度為子view的最大寬度,這樣viewgroup就能實現乙個wrap_content的效果。protected void onmeasure(int widthmeasurespec, int heightmeasurespec) }}
setmeasureddimension(500,h);
}
2、onlayout
這個方法有五個引數,算是挺多的了,先說下入參的含義。
changed 該引數指出當前viewgroup的尺寸或者位置是否發生了改變;left,top,right,bottom 當前viewgroup相對於其父控制項的座標位置。這個方法的作用簡單來說就是擺放view。這裡就不舉例子了,寫法很多,網上也有很多例子。
總結:這章就講了自定義viewgroup的onmeasure和onlayout簡單用法。
自定義view 二
自定義view的最重要的乙個部分是自定義它的外觀。根據你的程式的需求,通過ondraw方法實現繪製。在ondraw中,會傳遞給你乙個canvas。canvas封裝了繪製圖形的方法。還需要自定義乙個 paint去定義顏色樣式的填充 簡單來說 canvas定義你在螢幕上畫的圖形,而paint定義顏色,樣...
簡單的自定義view
最近看到乙個關於自定義view方面的介紹,覺得非常清楚明了,對最基本的理解是很easy的。然後獲取view自身的寬高,根據得知 width getright getleft height getbottom gettop view的原始碼當中提供了getwidth 和getheight 方法用來獲取...
自定義view移動整個view
時間比較短,直接上 了 import android.animation.objectanimator import android.content.context import android.graphics.pointf import android.util.attributeset imp...