Android-自定义控件之onMeasure浅谈

本文探讨了Android自定义控件中的onMeasure方法,解释了测量模式(EXACTLY, AT_MOST, UNSPECIFIED)及其在不同场景下的应用。文章通过实例分析了如何处理AT_MOST模式,以及如何根据SpecMode和SpecSize来确定控件大小。同时,文中还提及了根视图和子视图MeasureSpec的确定过程。" 138170331,461481,使用RandAugment提升图像分类模型的鲁棒性,"['机器学习', 'keras', '数据增强']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在练习自定义控件,网上资料太散,自己就记录一下。非常感谢那些分享的人,最后会标注上链接。

自定义控件中三大关键方法:
老大 onMeasure
老二 onLayout
老三 onDraw

Android 中一切显示控件皆继承至 View,而 onMeasure 则用于测量 View 的大小,只有先确定了大小,才能开始其他绘制的后续工作。

但是不了解就无法写自定义控件了么?或者说必须要去处理 onMeasure 么?
并不是所有情况下都需要去管onMeasure!比如你的控件大小是固定的,500dp。又比如你的控件是填充父控件的。这两种情况并不需要去管onMeasure,系统会处理。但是如果你的控件
想仅仅包裹内容,并且可以随着父控件的大小变化而适应,就必须手动处理 onMeasure,而这种情况恰恰是最常用的。

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){}

它有两个参数,刚开始看的我一脸懵逼。而它们其实是对应的源码里的 MeasureSpec 类,该类提供相关的方法去解析。其含义需要把它转换为二进制去理解,int的二进制位数是32位。最高的两位代表 SpecMode(测量模式)。后30位代表 SpecSize(指的是某种测量模式下的规格大小)。
例如 widthMeasureSpec 的解析方式:

int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int widthSize = MeasureSpec.getSize(widthMeasureSpec);

此时我们拿到了当前 View 宽度的 SpecMode(widthMode) 和 SpecSize(widthSize)。
SpecMode 一共有三种类型
1.EXACTLY : 表示父视图希望子视图的大小应该是由 specSize 的值来决定的,系统默认会按照这个规则来设置子视图的大小。
2.AT_MOST : 表示子视图最多只能是 specSize 中指定的大小,系统默认会按照这个规则来设置子视图的大小,如果超过 specSize 指定的大小,会导致视图显示不全。
3.UNSPECIFIED: 表示开发人员可以将视图按照自己的意愿设置成任意的大小,没有任何限制,可能是系统内部用的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值