1. 程式人生 > >onMeasure學習整理

onMeasure學習整理

onMeasure函式如下:

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)

onMeasure函式的呼叫者

包含這個View的具體的ViewGroup呼叫,引數也就是從這個ViewGroup中傳入的。

widthMeasureSpec與heightMeasureSpec來源與作用:
來源:
由ViewGroup中的layout_width,layout_height、padding、layout_margin和weight共同決定。

作用:
這兩個值由高32位和低16位組成。高32位儲存的值叫specMode,低16位的值叫specSize。分別可以通過getMode()和getSize()獲取。
specMode型別:

  • MeasureSpec.EXACTLY:LayoutParams.MATCH_PARENT。
  • MeasureSpec.AT_MOST:LayoutParams.WRAP_CONTENT。
  • MeasureSpec.UNSPECIFIED:我們可以隨意指定檢視的大小。
private static int getRootMeasureSpec(int windowSize, int rootDimension) {  
    int measureSpec;  
    switch (rootDimension) {  

    case ViewGroup.LayoutParams.MATCH_PARENT:  
        // Window can't resize. Force root view to be windowSize.  
measureSpec = MeasureSpec.makeMeasureSpec(windowSize, MeasureSpec.EXACTLY); break; case ViewGroup.LayoutParams.WRAP_CONTENT: // Window can resize. Set max size for root view. measureSpec = MeasureSpec.makeMeasureSpec(windowSize, MeasureSpec.AT_MOST); break
; default: // Window wants to be an exact size. Force root view to be that size. measureSpec = MeasureSpec.makeMeasureSpec(rootDimension, MeasureSpec.EXACTLY); break; } return measureSpec; }