自定義View之 onMeasure() view的高度自適應wrap_content view的測量
阿新 • • 發佈:2019-02-09
讀群英傳有感,筆記之。。。。。。
在很多自定義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; }
哪有不足之處請大家指出,共同進步。。。。