Android自定义View——onMeasure,onLayout,onDraw的作用

本文介绍了Android自定义View的绘制流程,包括onMeasure的宽高测量,onLayout的定位,以及onDraw的绘制过程。onMeasure中,通过MeasureSpec计算并设置View的宽高;onLayout主要负责View的位置设定,通常由父控件调用;onDraw用于内容绘制,开发者通常重写此方法实现自定义绘制。
摘要由CSDN通过智能技术生成

 View的绘制流程

一个View从创建到最终绘制出来,有三个方法是不得不提到的,那就是onMeasure测量,onLayout定位,onDraw绘制

onMeasure

对于一个View绘制前,首先需要测量出来这个View的宽高,而这步工作就是由onMeasure完成的了。

//view测量宽高的方法
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        //将计算出来的宽高传入setMeasureDimension方法中完成测量
        setMeasuredDimension(getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec),
                getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec));
    }

 setMeasureDimension方法通过传入的值计算出绝对宽高,并最终调用setMeasureDimensionRaw方法进行赋值

所以View的宽高测量关键就在于onMeasure方法中,我们只需要在该方法中计算出宽高,并调用setMeasureDimension方法即可完成测量步骤。

而对于宽高的计算,Android提供了一个非常精简有效的类MeasureSpec用于传递宽高信息的

MeasureSpec主要是三个方法

//用于父布局计算好子布局的宽高之后,用这个方法生成对应的int值传给子布局的onMeasure方法
//这个int值实际上是一个32位的二进制,前两位用于储存MODE,后30位用于储存SIZE
public static int makeMeasureSpec(@IntRange(from = 0, to = (1 << MeasureSpec.MODE_SHIFT) - 1) int size,
                                          @MeasureSpecMode int mode) {
            if (sUseBrokenMakeMeasureSpec) {
                return size + mode;
            } else {
                return (size & ~MODE_MASK) | (mode & MODE_MASK);
            }
        }

//用于解析宽高的MODE
public static int getMode(int measureSpec) {
            //noinspection ResourceType
            return (measureSpec & MODE_MASK);
        }

//用于解析宽高的SIZE
public static int getSize(int measureSpec) {
            return (measureSpec & ~MODE_MASK);
        }

Measure

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值