1.自定義控件方法的理解
(1) View的測量onMeasure():這個方法主要是測量View寬度和高度摆碉。
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
在這個方法中罗售,可以通過MeasureSpec.getMode()和MeasureSpec.getSize()這兩個方法來獲取寬和高的mode蒸辆、size蔗草,然后我們可以根據(jù)這個不同類型的mode來判斷需要返回的size,最后將這個寬和高的size設(shè)置在setMeasureDimension()方法中寞射,來保存自定義的寬度和高度窖认。
關(guān)于這個mode有三種類型:
- EXACTLY:一般是設(shè)置了明確的值或者MATCH_PARENT;(返回的一般都是size)
- AT_MOST:子布局限制在一個最大值內(nèi)豫柬,一般斗志W(wǎng)RAP_CONTENT;(返回的是自定義本身的size)
- UNSPECIFIED:表示子布局想要多大就多大愈污,這個一般很少用;
代碼如下:
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
//測量寬度
int measureWidth = measureWidth(widthMeasureSpec);
//測量高度
int measureHeight = measureHeight(heightMeasureSpec);
//通過setMeasuredDimension()這個方法將測量好的寬和高設(shè)置進去
setMeasuredDimension(measureWidth, measureHeight);
}
/**
* 測量高度
*
* @param heightMeasureSpec
* @return
*/
private int measureHeight(int heightMeasureSpec) {
int result = 0;
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
int heightSize = MeasureSpec.getSize(heightMeasureSpec);
switch (heightMode) {
case MeasureSpec.EXACTLY:
result = heightSize;
break;
case MeasureSpec.AT_MOST:
result = 200;
result = Math.min(result, heightSize);
break;
}
return result;
}
/**
* 測量寬度
*
* @param widthMeasureSpec
* @return
*/
private int measureWidth(int widthMeasureSpec) {
int result = 0;
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
switch (widthMode) {
case MeasureSpec.EXACTLY:
result = widthSize;
break;
case MeasureSpec.AT_MOST:
result = 200;
result = Math.min(result, widthSize);
break;
}
return result;
}
(2) onLayout():這個方法主要是擺放子布局在父布局中的位置轮傍;主要是調(diào)用layout()方法來擺放位置。
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
}
setFrame方法的作用就是將新傳入的ltrb屬性賦值給View首装,然后判斷當(dāng)前View大小和位置是否發(fā)生了變化并返回
(3) onDraw():這個方法主要是通過前兩個得到的參數(shù)值將自定義的view在屏幕上顯示出來创夜;調(diào)用draw()方法來設(shè)置顯示的位置
*getWidth()、getHeight()和getMeasuredWidth,getMeasuredHeight的區(qū)別:
getWidth()仙逻、getHeight():這個獲取的是子View相對于父View的位置驰吓,只可在onLayout()方法中獲取系奉;
getMeasuredWidth,getMeasuredHeight:這個是自定義View測量后的實際值檬贰。