自定義View之 onMeasure() view的高度自適應wrap_content view的測量

讀羣英傳有感,筆記之。。。。。。

在很多自定義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;

	}



哪有不足之處請大家指出,共同進步。。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章