天天看點

View 的繪圖流程 (二)

onMeasure

可以在視圖中重寫 onMeasure 方法計算該視圖的精确的寬高,其中父容器會給定參考的寬高以及快高的模式

擷取模式:

// 擷取寬的模式
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
switch (widthMode){
    case MeasureSpec.EXACTLY:
    // 精确的值 math_parent 100dp 20dp
        break;
    case MeasureSpec.AT_MOST:
    // 有一個最大的參考值,建議不要超過該值 , 像 wrap_content
        break;
    case MeasureSpec.UNSPECIFIED:
    // 未指定,一般開發者不要使用
        break;
}
           
擷取尺寸 ( 像素 )
// 尺寸
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
           
設定精确的寬高
setMeasuredDimension(widthSize,heightSize);
如:寬度如果是 wrap_content 那麼用  個像素,高度如果是 wrap_content 則用  個像素
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    // 擷取寬的模式
    int widthMode = MeasureSpec.getMode(widthMeasureSpec);
    // 尺寸
    int widthSize = MeasureSpec.getSize(widthMeasureSpec);
        if(widthMode == MeasureSpec.AT_MOST){
            widthSize = ;
        }
    int heightMode = MeasureSpec.getMode(heightMeasureSpec);
    int heightSize = MeasureSpec.getSize(heightMeasureSpec);
        if(heightMode == MeasureSpec.AT_MOST){
            heightSize = ;
        }
    setMeasuredDimension(widthSize,heightSize);
}
           

繼續閱讀