0. 流程圖
1. 構(gòu)造函數(shù)
//一般在直接New一個View的時候調(diào)用舆驶。
public void View(Context context) {}
//一般在layout文件中使用的時候會調(diào)用,關(guān)于它的所有屬性(包括自定義屬性)都會包含在attrs中傳遞進來缭嫡。
public void View(Context context, AttributeSet attrs) {}
public void View(Context context, AttributeSet attrs, int defStyleAttr) {} // 通常不用
public void View(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {} // 通常不用
2. 使用onMeasure()
測量View大小()
onMeasure()
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int widthsize = MeasureSpec.getSize(widthMeasureSpec); //取出寬度的確切數(shù)值
int widthmode = MeasureSpec.getMode(widthMeasureSpec); //取出寬度的測量模式
int heightsize = MeasureSpec.getSize(heightMeasureSpec); //取出高度的確切數(shù)值
int heightmode = MeasureSpec.getMode(heightMeasureSpec); //取出高度的測量模式
}
模式
模式 |
二進制數(shù)值 |
描述 |
UNSPECIFIED |
00 |
默認值所意,父View沒有給子view任何限制,子View可以設(shè)置為任意大小拍棕。 |
EXACTLY |
01 |
表示父View已經(jīng)確切的指定了子View的大小喻粹。 |
AT_MOST |
10 |
表示子View具體大小沒有尺寸限制,但是存在上限笼裳,上限一般為父View大小唯卖。 |
注意
- 如果在
onMeasure()
中對View
的寬高進行修改了,不要調(diào)用 super.onMeasure(widthMeasureSpec, heightMeasureSpec)
要調(diào)用 setMeasuredDimension(widthsize, heightsize)
躬柬。
3. 使用onSizeChanged()
確定View大小
-
onSizeChanged()
在視圖大小發(fā)生改變時調(diào)用拜轨,包括父View大小改變進而影響自定義的子View
。
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
}
4. 使用onLayout()
確定子View布局位置
- 自定義
ViewGroup
時允青,需要重寫onLayout()
橄碾。
-
onLayout()
用于確定 子View 的位置。
-
onLayout()
做的東西主要是以下幾點:
- 取出所有 子View 颠锉。
- 經(jīng)過計算得出各個 子View 位置的坐標(biāo)值法牲。
- 用以下函數(shù)設(shè)置 子View 位置。
child.layout(l, t, r, b);
名稱 |
說明 |
對應(yīng)的函數(shù) |
l |
View左側(cè)距父View左側(cè)的距離 |
getLeft() |
t |
View頂部距父View頂部的距離 |
getTop() |
r |
View右側(cè)距父View左側(cè)的距離 |
getRight() |
b |
View底部距父View頂部的距離 |
getBottom() |
5. 使用onDraw()
繪制內(nèi)容
-
onDraw()
是實際繪制的部分琼掠,使用的是 Canvas 繪圖拒垃。
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
}
6. 對外提供操作方法和監(jiān)聽回調(diào)
- 自定義完
View
之后,一般會對外暴露一些接口瓷蛙,用于控制View
的狀態(tài)等悼瓮,或者監(jiān)聽View
的變化。
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者