Android自定义View之Window、ViewRootImpl和View的三大流程

本文详细介绍了Android自定义View的三大流程——measure、layout和draw,以及Window和ViewRootImpl的角色。讨论了MeasureSpec在测量过程中的作用,ViewGroup如何测量子元素,以及在Activity中正确获取View宽高的方法。同时阐述了Window的添加过程,强调了Window在View显示和事件处理中的关键作用,以及自定义View时需要注意的wrap_content处理。
摘要由CSDN通过智能技术生成

Android自定义View系列

View的三大流程指的是measure(测量)、layout(布局)、draw(绘制)。

下面我们来分别看看这三大流程

View的measure(测量)

MeasureSpec

MeasureSpec是View的一个内部静态类

//view.class
public static class MeasureSpec {
   
    private static final int MODE_SHIFT = 30;
    private static final int MODE_MASK  = 0x3 << MODE_SHIFT;

    ...

    /**
     * 这种模式不用关心
     */
    public static final int UNSPECIFIED = 0 << MODE_SHIFT;

    /**
     * 精确模式,对应的是match_parent和具体值,比如100dp
    public static final int EXACTLY     = 1 << MODE_SHIFT;

    /**
     * 最大模式,对应的就是wrap_content
     */
    public static final int AT_MOST     = 2 << MODE_SHIFT;


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

    /**
     * 获取测量的模式
     */
    @MeasureSpecMode
    public static int getMode(int measureSpec) {
        //noinspection ResourceType
        return (measureSpec & MODE_MASK);
    }

    /**
     * 获取测量到的尺寸大小
     */
    public static int getSize(int measureSpec) {
        return (measureSpec & ~MODE_MASK);
    }

    ...
}

MeasureSpec总结起来就是:
- 它由2部分数据组成,分别为定义了View测量的模式和View的测量尺寸大小
- 其中EXACTLY精确模式表示的是match_parent和具体值;AT_MOST最大模式表示的是wrap_content的情况

View的measure过程

View的measure过程由其measure方法完成,在measure方法中会调用View的onMeasure方法

protected 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值