![Android程序员面试笔试宝典](https://wfqqreader-1252317822.image.myqcloud.com/cover/682/39130682/b_39130682.jpg)
上QQ阅读APP看书,第一时间看更新
3.1.1 onMeasure()
在自定义一个View时,要先知道它的大小,所以就需要使用onMeasure()方法对View的大小进行测量:
![](https://epubservercos.yuewen.com/FCD2F4/20516007501589706/epubprivate/OEBPS/Images/55_01.jpg?sign=1739648315-gYkHf1umIt14jJwWEOVsr1F2UgM8JwFB-0-7c9295e838e19ac537a4aa831bde89eb)
参数widthMeasureSpec和heightMeasureSpec分别存储了该View的父View的宽和高的信息。什么是宽和高的信息?以widthMeasureSpec为例,它包含了宽的信息,宽的信息就是宽度和测量模式,而heightMeasureSpec包含的则是高度和测量模式。需要注意的是这里的宽度和高度都是父View的宽度和高度。怎么获取这些信息呢?Android提供了一个类MeasureSpec,能直接使用它来获取宽度/高度和测量模式:
![](https://epubservercos.yuewen.com/FCD2F4/20516007501589706/epubprivate/OEBPS/Images/55_02.jpg?sign=1739648315-GBhlxBKPKzuVFiinjPwKRXPiK1u8dsKE-0-782ae3313d61eeab6e0927fdcb145d03)
再说回这个测量模式的作用,测量模式有3种:
●UNSPECIFIED:View的大小没有限制,可以是任意大小;
●EXACTLY:当前的尺寸大小就是View的大小;
●AT_MOST:View能取的尺寸大小不能超过当前值大小。
所以当开发者在布局中如果指定match_parent则相当于EXACTLY模式,指定wrap_content则相当于AT_MOST模式,而指定具体值也是相当于EXACTLY模式。
回到MyPingredView类中,假设现在想让MyPingredView以长方形的形式显示,默认宽和高分别是100和200,可以使用下面的代码来实现:
![](https://epubservercos.yuewen.com/FCD2F4/20516007501589706/epubprivate/OEBPS/Images/55_03.jpg?sign=1739648315-kmdErEf8tuWdxzjkddbC9qTa1FtjETr9-0-94d85ba5e605e32bef908dbe0dab27ed)
![](https://epubservercos.yuewen.com/FCD2F4/20516007501589706/epubprivate/OEBPS/Images/56_01.jpg?sign=1739648315-sjY03jUfffIU9sbOZ94mtAZ4hHLcQXcs-0-28c66997f7675b6df7efaf2c2bdf43b3)
然后在布局文件中设置MyPingredView:
![](https://epubservercos.yuewen.com/FCD2F4/20516007501589706/epubprivate/OEBPS/Images/56_02.jpg?sign=1739648315-eonzbm1rePgP6kaEEbdbO0lG7COka3WB-0-ebc0c04a46c77feae0081a0a2b039da3)
布局显示的效果如图3.1所示。