讀羣英傳有感,筆記之。。。。。。
在很多自定義view之後,控件的高度需要自適應,即使使用wrap_content沒有作用還是match_parent的效果,這時就需要重寫onMeasure()方法來實現,view類的onMeasure()方法默認是隻支持.EXACTLY模式,所以在自定義view先支持wrap_content就得重寫onMeasure(),在這裏就需要說一下測量的三種模式了:
第一種:
EXACTCLY
大概意思就是精確值模式,我們在佈局文件中的寬和高爲具體值,或爲match_parent(父佈局的大小)屬性時系統會用次模式,
第二種:
AT_MOST
大概意思就是最大值模式,我理解爲就是自適應。我們在佈局文件中的寬和高爲wrap_content 屬性時,控件的大小一般會隨着子View大小大或內容的多少的變化而變化,此控件只要不超過父控件的大小就行。
第三種:
UNSPECIFIED
這種模式不指定測量模式,view大小沒有限制,想多大就多大。
我們可以通過MeasureSpec這個類的getMode()和getSize()方法獲取測量模式和大小,
代碼如下:
沒什麼邏輯,仔細看一下就ok了
/**
* view的大小控制
*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
setMeasuredDimension(measureWidth(widthMeasureSpec),
measureHeight(heightMeasureSpec));
}
private int measureHeight(int measureSpec) {
int result = 0;
int mode = MeasureSpec.getMode(measureSpec);
int size = MeasureSpec.getSize(measureSpec);
if (mode == MeasureSpec.EXACTLY) {
result = size;
} else {
result=75;
if (mode == MeasureSpec.AT_MOST) {
result = Math.min(result, size);
}
}
return result;
}
private int measureWidth(int measureSpec) {
int result = 0;
int mode = MeasureSpec.getMode(measureSpec);
int size = MeasureSpec.getSize(measureSpec);
if (mode == MeasureSpec.EXACTLY) {
result = size;
} else {
result = 75;//根據自己的需要更改
if (mode == MeasureSpec.AT_MOST) {
result = Math.min(result, size);
}
}
return result;
}
哪有不足之處請大家指出,共同進步。。。。