天天看点

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);
}
           

继续阅读