zoukankan      html  css  js  c++  java
  • MeasureSpec介绍及使用详解

    一个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):根据提供的大小值和模式创建一个测量值(格式)

    这个类的使用呢,通常在view组件的onMeasure方法里面调用.

    看看它的使用吧,ListView.measureItem(View child)

    首先一个我们常用到的一个有用的函数,View.resolveSize(int size,int measureSpec)

    [html] view plaincopy
     
    1. public static int resolveSize(int size, int measureSpec) {  
    2.          int result = size;  
    3.          int specMode = MeasureSpec.getMode(measureSpec);  
    4.          int specSize =  MeasureSpec.getSize(measureSpec);  
    5.          switch (specMode) {  
    6.          case MeasureSpec.UNSPECIFIED:  
    7.              result = size;  
    8.              break;  
    9.          case MeasureSpec.AT_MOST:  
    10.              result = Math.min(size, specSize);  
    11.              break;  
    12.          case MeasureSpec.EXACTLY:  
    13.              result = specSize;  
    14.              break;  
    15.          }  
    16.          return result;  
    17.      }  
    9023         public static int makeMeasureSpec(int size, int mode) {
    9024             return size + mode;
    9025         }
    [html] view plaincopy
     
    1. private void measureItem(View child) {  
    2.          ViewGroup.LayoutParams p = child.getLayoutParams();  
    3.          if (p == null) {  
    4.              p = new ViewGroup.LayoutParams(  
    5.                      ViewGroup.LayoutParams.MATCH_PARENT,  
    6.                      ViewGroup.LayoutParams.WRAP_CONTENT);  
    7.          }  
    8.    
    9.          int childWidthSpec = ViewGroup.getChildMeasureSpec(mWidthMeasureSpec,  
    10.                  mListPadding.left + mListPadding.right, p.width);  
    11.          int lpHeight = p.height;  
    12.          int childHeightSpec;  
    13.          if (lpHeight > 0) {  
    14.              childHeightSpec = MeasureSpec.makeMeasureSpec(lpHeight, MeasureSpec.EXACTLY);  
    15.          } else {  
    16.              childHeightSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);  
    17.          }  
    18.          child.measure(childWidthSpec, childHeightSpec);  
    19.      }  

     注意,使用EXACTLY和AT_MOST通常是一样的效果,如果你要区别他们,那么你就要使用上面的函数View.resolveSize(int size,int measureSpec)返回一个size值,然后使用你的view调用setMeasuredDimension(int,int)函数。

    8406     protected final void setMeasuredDimension(int measuredWidth, int measuredHeight) {
    8407         mMeasuredWidth = measuredWidth;
    8408         mMeasuredHeight = measuredHeight;
    8409 
    8410         mPrivateFlags |= MEASURED_DIMENSION_SET;
    8411     }

      然后你调用view.getMeasuredWidth,view.getMeasuredHeigth 返回的就是上面函数里的mMeasuredWidth,mMeasuredHeight的值。

  • 相关阅读:
    年轻人的第一个 Spring Boot 应用,太爽了!
    面试问我 Java 逃逸分析,瞬间被秒杀了。。
    Spring Boot 配置文件 bootstrap vs application 到底有什么区别?
    坑爹的 Java 可变参数,把我整得够惨。。
    6月来了,Java还是第一!
    Eclipse 最常用的 10 组快捷键,个个牛逼!
    Spring Cloud Eureka 自我保护机制实战分析
    今天是 Java 诞生日,Java 24 岁了!
    厉害了,Dubbo 正式毕业!
    Spring Boot 2.1.5 正式发布,1.5.x 即将结束使命!
  • 原文地址:https://www.cnblogs.com/bdbw2012/p/4673231.html
Copyright © 2011-2022 走看看