View及ViewGroup的布局方法及相互关系


布局时两次遍历
     第一次measure,测试child所需空间
     第二次layout,给child安排空间


方法之间的相互关系,重点是measure和layout

~~~~第一遍是measure~~~~~~~~~~~
View类
     measure()设置为final,禁止被派生类override
          onMeasure()必须override,计算自己的大小
               setMeasuredDimension()必须被调用,以此来设置在根View类中的measure尺寸变量
               注意,measure的结果可以通过getMeasuredWidth()查看,是一个View类中变量


ViewGroup类派生自View类,且实现了两个接口
     没有measure()
     没有onMeasure(),说明使用父类onMeasure()

     measureChildren()找不到调用者,可能仅仅是一个示范?


LinearLayout派生自ViewGroup类
     覆盖onMeasure()
          调用child.measure()也即子View的measures()来深度遍历
          调用setMeasuredDimension()来设置在根View类中的measure尺寸变量

TextView类派生自View类
     没有measure(),被禁止覆盖
     覆盖onMeasure()
          setMeasuredDimension(width, height);


~~~~第二遍是layout~~~~~~~~~~~
View类
     layout(),没有被设置为final,但注释提示派生类不要覆盖,而是去覆盖onLayout(),但实际上ViewGroup覆盖了
          onLayout()是个空函数,如果派生类有child则覆盖本方法,并在其中调用child.layout
          通知注册的监听器


ViewGroup类
     layout(),调用了父类layout(),没有调用自己的onLayout(),不过可能辗转调回自己的onLayout()?
     protected abstract void onLayout(boolean changed, int l, int t, int r, int b)注意这里变成抽象方法了,也即派生类必须覆盖
     

LinearLayout派生自ViewGroup类
     onLayout()
          child.layout()


TextView类派生自View类
     无layout(),也没有onLayout(),因为没有子View


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值