最近在练习自定义控件,网上资料太散,自己就记录一下。非常感谢那些分享的人,最后会标注上链接。
自定义控件中三大关键方法:
老大 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: 表示开发人员可以将视图按照自己的意愿设置成任意的大小,没有任何限制,可能是系统内部用的。