MeasureSpec

2016-2-17 chenhui 自定义控件

MeasureSpec 在 View 的绘制中,起到记录 View 的大小和位置信息的作用。


他是一个 32 位的 int 值,其高 2 位是测量模式,其余的位是 View 的高/宽,什么是测量模式?我们知道,在 Android 中,View 的大小可以是一个具体值,也可以是 match_parent 或 wrap_content,这三种大小都有自己的测量模式,高 2 位就用来记录他的测量模式。


测量模式有三种:

  • EXACTLY,精确值模式,即大小为精确值或 match_parent 时的模式(上级View的大小是确定的)。
  • AT_MOST,最大值模式,大小为 wrap_content 时,为该模式。
  • UNSPECIFIED,不指定大小模式,View 想多大就多大,通常在自定义 View 中使用。


由于 AT_MOST 模式的特殊性,他的大小是根据 View 内部的内容决定的,这就意味着,自定义 View 如果想支持 "wrap_content" 这个属性值,那么就必须重写 View 大小的测量方法,也就是 onMeasure() 方法,并在这个方法中检测是否为 AT_MOST 模式,如果是,则要自己计算 View 的大小。


我们可以调用 MeasureSpec.getSize(int) 来得到他的高/宽,以及 MeasureSpec.getMode(int) 来得到他的模式。

发表评论:

Copyright ©2015-2016 freehui All rights reserved