View的测量

View通过MeasureSpac类来测量大小。MeasureSpec是一个32位的int值,其中高2位为测量的模式,低30位为测量的大小。MeasureSpec.getMode(measureSpec)这个方法获取测量的模式。MeasureSpec.getSize(measureSpec)获取测量的数值。

测量的模式

测量模式分为三种:EXACTLY、AT_MOST、UNSPECIFIED。

EXACTLY:

精确模式,当layout_width或layout_height指定为match_parent或者指定具体数值时使用。

AT_MOST:

最大模式,当layout_width或layout_height指定为wrap_content时使用。控件大小随子空间变化。

UNSPECIFIED:

不指定其大小测量模式,一般在绘制自定义View时使用。


在自定义控件中使用了父类View.Java中的onMeasure方法来测量大小。VIew中使用setMeasuredDimension来设置测量大小。

onMeasure

getDefaultSize中根据不同的模式进行大小设置。如果是EXACTLY模式返回传入的大小。如果是AT_MOST和UNSPECIFIED返回getSuggestedMinimumWidth()或者是getSuggestedMinimumHeight()。

源码如下:


getDefaultSize()

getSuggestedMinimumWidth()和getSuggestedMinimumHeight(),如果VIew没有背景就返回最小值,如果有背景则返回背景大小和VIew大小中的较大值。解释的不好还是看代码比较直观。


getSuggestedMinimumWidth

在使用自定义控件时很多时候要重写onMeasure方法来返回更准确的大小数值。在自定义控件中宽高属性设置为wrap_content,如果不重写onMeasure()方法,系统就会默认填充整个父布局。如果自定义控件继承自TextView等一些基础的控件时,可以不用再重写,因为在这些自定义控件中已经重写了onMeasure方法。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容