自定义View(二):布局

参考:学习视频
在这里插入图片描述
在这里插入图片描述

一、自定义View:布局基础

布局过程的自定义

  • 方式:重写布局过程的相关方法
  1. 测量过程:onMeasure()
  2. 布局过程:onLayout()
  • 具体
  1. 重新onMeasure()来修改已有的View的尺寸
  2. 重写onMeasure()来全新计算自定义View的尺寸
  3. 重写onMeasure()和onLayout()来全新计算自定义ViewGroup的内部布局

二、全新定义View尺寸的方式

  1. 重写onMeasure()把尺寸计算出来
  2. 把计算的结果用resolveSize()过滤一遍后保存

重写onMeasure()修改尺寸

  1. 重写onMeasure(),并调用super.onMeasure()触发原先的测量
  2. 用getMeasuredWidth()和getMeasuredHeight()取到之前测得的尺寸,利用这两个尺寸来计算出最终尺寸。
  3. 使用setMeasuredDimension()保存尺寸

三、定制Layout的内部布局

onMeasure()的重写

  1. 调用每个子View的measure(),让子View自我测量
  2. 根据子View给出的尺寸,得出子View的位置,并保存它们的位置和尺寸
  3. 根据子View的位置和尺寸计算出自己的尺寸,并用setMeasuredDimension保存

关于保存子View位置的两点说明:

  1. 不是所有的Layout都需要保存子View的位置(因为有的Layout可以在布局阶段实时推导出子View的位置,例如LinearLayout)
  2. 有时候对某些子View需要重复测量两次或多次才能得到正确的尺寸和位置

“可用空间”的判断方法
根据自己的MeasureSpec中mode的不同
1. EXACTLY/AT_MOST
  可用空间:MeasureSpec中的size
2. UNSPECIFIED
  可用空间:无限大

Layout内部布局的自定义

  1. 重写onMeasure()来计算内部布局
    1)计算子View的尺寸
       ① 关键:宽带和高度的MeasureSpec的计算
       ② 结合开发者的要求(Layout_xxx)和 自己的可用空间(自己的尺寸上限 - 已用尺寸)
    2)计算子View的位置并保存子View的位置和尺寸
    3)计算自己的尺寸并保存
  2. 重写onLayout()来摆放子View
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值