View中MeasureSpec的作用

来源:互联网 发布:开票软件为什么打不开 编辑:程序博客网 时间:2024/05/25 08:11
一个MeasureSpec封装了父布局传递给子布局的布局要求,每个MeasureSpec代表了一组宽度和高度的要求。一个MeasureSpec由大小和模式组成。它有三种模式:UNSPECIFIED(未指定),父元素部队自元素施加任何束缚,子元素可以得到任意想要的大小;EXACTLY(完全),父元素决定自元素的确切大小,子元素将被限定在给定的边界里而忽略它本身大小;AT_MOST(至多),子元素至多达到指定大小的值。
 
常用的三个函数:
1.static int getMode(int measureSpec):根据提供的测量值(格式)提取模式(上述三个模式之一)
2.static int getSize(int measureSpec):根据提供的测量值(格式)提取大小值(这个大小也就是我们通常所说的大小)

3.static int makeMeasureSpec(int size,int mode):根据提供的大小值和模式创建一个测量值(格式)

可以看到这里:

a、根据大小(size)和模式(mode)生成一个测量规格;

b、根据测量规格(MeasureSpec)获取大小(size)和模式(mode)




MeasureSpec本身是一个32位的int值, 但是却表示了两种信息.
高2位: 代表了SpecMode, 测量模式

低30位: 代表了SpecSize, 在上述测量模式中的大小


public static class MeasureSpec {    private static final int MODE_SHIFT = 30;    private static final int MODE_MASK  = 0x3 << MODE_SHIFT;    public static final int UNSPECIFIED = 0 << MODE_SHIFT;    public static final int EXACTLY     = 1 << MODE_SHIFT;    public static final int AT_MOST     = 2 << MODE_SHIFT;        public static int makeMeasureSpec(int size, int mode) {      if (sUseBrokenMakeMeasureSpec) {          return size + mode;      } else {          return (size & ~MODE_MASK) | (mode & MODE_MASK);      }    }        public static int makeSafeMeasureSpec(int size, int mode) {      if (sUseZeroUnspecifiedMeasureSpec && mode == UNSPECIFIED) {          return 0;      }      return makeMeasureSpec(size, mode);    }        public static int getMode(int measureSpec) {      return (measureSpec & MODE_MASK);    }                 public static int getSize(int measureSpec) {      return (measureSpec & ~MODE_MASK);   }   .....}


这里高两位的值为2代表的是AT_MOST模式,为1代表的是EXACTLY模式,为0则代表UNSPECIFIED模式。


参考:

http://szysky.com/2016/08/10/%E3%80%8AAndroid%E5%BC%80%E5%8F%91%E8%89%BA%E6%9C%AF%E6%8E%A2%E7%B4%A2%E3%80%8B04-View%E7%9A%84%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86/

http://www.cnblogs.com/slider/archive/2011/11/28/2266538.html


http://yongyu.itscoder.com/2016/09/11/view_measure/


0 0
原创粉丝点击