(轉(zhuǎn))自定義控件MeasureSpecs與measure的理解

MeasureSpace
是android中父view傳遞給子view的用來描述對子 view布局需求的數(shù)據(jù)類型,也就是說父布局把它希view的大小以及變化的尺度分裝在這個類里,而子view的measure()方法拿到這個數(shù)值,則會根據(jù)這個數(shù)值對自身進行測量。

1.UNSPECIFIED :父試圖不對子試圖有任何的約束,它可以達到這幾所需要的尺寸大小,例如:ListView,ScrollView等,一般在我們在自定義控件中不會用到這個測量模式的。

2.EXACTLY:父視圖指定了確切的大小,無論子視圖指定多大的尺寸,子視圖必須在父視圖指定的大小范圍內(nèi),對應(yīng)的屬性為match_parent或者具體的值,父控件可以通過MeasureSpec.getSize(measureSpec)直接得到子控件的尺寸。

3.AT_MOST:父控件為子控件指定一個最大尺寸,子視圖必須確保自己的孩子視圖可以適應(yīng)在該尺寸范圍內(nèi),對應(yīng)的屬性為wrap_content,這種模式下父控件無法測量子view的大小,只能由子控件自己根據(jù)需求去計算自己的尺寸,這種模式就是我們自定義視圖需要實現(xiàn)測量邏輯的情況。

//這個是由我們給出的尺寸大小和模式生成一個包含這兩個信息的int變量,這里這個模式這個參數(shù),傳三個常量中的一個。
public static int makeMeasureSpec(int size, int mode)

//這個是得到這個變量中表示的模式信息,將得到的值與三個常量進行比較。
public static int getMode(int measureSpec)

//這個是得到這個變量中表示的尺寸大小的值。
public static int getSize(int measureSpec)

Measure
是對控件的大小的一個測量,

OnMeasure(int widthMeasureSpec, int heightMeasureSpec)該方法就是我們自定義控件中測量邏輯的方法,該方法中的參數(shù)是父view傳遞給子view測量width與height大小的要求。在我們自定義視圖中,要做的就是根據(jù)widthMeasureSpec與heightMeasureSpec進行對view寬高的一個測量,不同的測量模式,測量的邏輯是不同的。

setMeasuredDimension()是對測量后的值的一個回傳,我們只需要在onMeasure()中調(diào)用這方法把測量后的值傳遞進去,這樣測量的任務(wù)就算結(jié)束了。

measureChildren(int widthMeasureSpec, int heightMeasureSpec) 是用來測量所有子View的寬高。
measureChild(View child, int parentWidthMeasureSpec, int parentHeightMeasureSpec) 是用來測量單個子View的寬高。

來源:https://blog.csdn.net/qq_32204197/article/details/76577412

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容