精华内容
下载资源
问答
  • onMeasure方法

    千次阅读 2012-11-27 19:29:53
    onMeasure方法在控件的父元素正要放置它的子控件时调用.它会问一个问题,“你想要用多大地方啊?”,然后传入两个参数——widthMeasureSpec和heightMeasureSpec.  它们指明控件可获得的空间以及关于这个空间描述...

    onMeasure方法在控件的父元素正要放置它的子控件时调用.它会问一个问题,“你想要用多大地方啊?”,然后传入两个参数——widthMeasureSpec和heightMeasureSpec.

      它们指明控件可获得的空间以及关于这个空间描述的元数据.
      比返回一个结果要好的方法是你传递View的高度和宽度到setMeasuredDimension方法里.

      接下来的代码片段给出了如何重写onMeasure.注意,调用的本地空方法是来计算高度和宽度的.它们会译解widthHeightSpec和heightMeasureSpec值,并计算出合适的高度和宽度值.

        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int measuredHeight = measureHeight(heightMeasureSpec);
        int measuredWidth = measureWidth(widthMeasureSpec);
        setMeasuredDimension(measuredHeight, measuredWidth);
        }
        private int measureHeight(int measureSpec) {
        // Return measured widget height.
        }
        private int measureWidth(int measureSpec) {
        // Return measured widget width.
        }
         边界参数——widthMeasureSpec和heightMeasureSpec ,效率的原因以整数的方式传入。

          

         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方法里面调用但也有少数例外

     

           在它们使用之前,首先要做的是使用MeasureSpec类的静态方法getMode和getSize来译解,如下面的片段所示:

    java代码:

    1. int specMode = MeasureSpec.getMode(measureSpec);
    2. int specSize = MeasureSpec.getSize(measureSpec);
    复制代码


           依据specMode的值,如果是AT_MOST,specSize 代表的是最大可获得的空间;如果是EXACTLY,specSize 代表的是精确的尺寸;如果是UNSPECIFIED,对于控件尺寸来说,没有任何参考意义。
      当以EXACT方式标记测量尺寸,父元素会坚持在一个指定的精确尺寸区域放置View。在父元素问子元素要多大空间时,AT_MOST指示者会说给我最大的范围。在很多情况下,你得到的值都是相同的。
      在两种情况下,你必须绝对的处理这些限制。在一些情况下,它可能会返回超出这些限制的尺寸,在这种情况下,你可以让父元素选择如何对待超出的View,使用裁剪还是滚动等技术。

      接下来的框架代码给出了处理View测量的典型实现:

        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int measuredHeight = measureHeight(heightMeasureSpec);
        int measuredWidth = measureWidth(widthMeasureSpec);
        setMeasuredDimension(measuredHeight, measuredWidth);
        }
        private int measureHeight(int measureSpec) {
        int specMode = MeasureSpec.getMode(measureSpec);
        int specSize = MeasureSpec.getSize(measureSpec);
        // Default size if no limits are specified.
        int result = 500;
        if (specMode == MeasureSpec.AT_MOST){
        // Calculate the ideal size of your
        // control within this maximum size.
        // If your control fills the available
        // space return the outer bound.
        result = specSize;
        }
        else if (specMode == MeasureSpec.EXACTLY){
        // If your control can fit within these bounds return that value.
        result = specSize;
        }
        return result;
        }
        private int measureWidth(int measureSpec) {
        int specMode = MeasureSpec.getMode(measureSpec);
        int specSize = MeasureSpec.getSize(measureSpec);
        // Default size if no limits are specified.
        int result = 500;
        if (specMode == MeasureSpec.AT_MOST){
        // Calculate the ideal size of your control
        // within this maximum size.
        // If your control fills the available space
        // return the outer bound.
        result = specSize;
        }
        else if (specMode == MeasureSpec.EXACTLY){
        // If your control can fit within these bounds return that value.
        result = specSize;
        }
        return result;
        }


    展开全文
  • 在开发中,当Android原生控件不... 什么时候调用onMeasure方法?  当子View的父控件要放置该View的时候,父控件会传递两个参数给View——widthMeasureSpec和heightMeasureSpec。这两个参数是View可以获取的宽高尺寸和

    在开发中,当Android原生控件不能满足我们的需求的时候,就需要自定义View。View在屏幕上绘制出来先要经过measure(计算)和layout(布局)。

      什么时候调用onMeasure方法?

      当子View的父控件要放置该View的时候,父控件会传递两个参数给View——widthMeasureSpec和heightMeasureSpec。这两个参数是View可以获取的宽高尺寸和模式 混合的int数据。可以通过int mode = MeasureSpec.getMode(widthMeasureSpec)得到模式,用int size = MeasureSpec.getSize(widthMeasureSpec)得到尺寸。

      mode共有三种情况,取 分别为

      MeasureSpec.UNSPECIFIED,MeasureSpec.EXACTLY,MeasureSpec.AT_MOST。

      MeasureSpec.EXACTLY是精确尺寸,当我们将控件的layout_width或layout_height指定为具体数 时如

      andorid:layout_width="50dip",或者为FILL_PARENT是,都是控件大小已经确定的情况,都是精确尺寸。

      MeasureSpec.AT_MOST是最大尺寸,当控件的layout_width或layout_height指定为WRAP_CONTENT时,控件大小一般随着控件的子空间或内容进行变化,此时控件尺寸只要不超过父控件允许的最大尺寸即可。因此,此时的mode是AT_MOST,size给出了父控件允许的最大尺寸。

      MeasureSpec.UNSPECIFIED是未指定尺寸,这种情况不多,一般都是父控件是AdapterView,通过measure方法传入的模式。

      可以调用setMeasuredDimenson方法,将View的高度和宽度传入,设置子View实际的大小,告诉父控件需要多大的空间放置子View。

      以下是框架中View的onMeasure的典型实现:

      @Override

      protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

      int measuredHeight = measureHeight(heightMeasureSpec);

      int measuredWidth = measureWidth(widthMeasureSpec);

      setMeasuredDimension(measuredHeight, measuredWidth);

      private int measureHeight(int measureSpec) {

      int specMode = MeasureSpec.getMode(measureSpec);

      int specSize = MeasureSpec.getSize(measureSpec);

      // Default size if no limits are specified.

      int result = 500;

      if (specMode == MeasureSpec.AT_MOST) {

      // Calculate the ideal size of your

      // control within this maximum size.

      // If your control fills the available

      // space return the outer bound.

      result = specSize;

      } else if (specMode == MeasureSpec.EXACTLY) {

      // If your control can fit within these bounds return that

      // value.

      result = specSize;

      return result;

      private int measureWidth(int measureSpec) {

      int specMode = MeasureSpec.getMode(measureSpec);

      int specSize = MeasureSpec.getSize(measureSpec);

      // Default size if no limits are specified.

      int result = 500;

      if (specMode == MeasureSpec.AT_MOST) {

      // Calculate the ideal size of your control

      // within this maximum size.

      // If your control fills the available space

      // return the outer bound.

      result = specSize;

      else if (specMode == MeasureSpec.EXACTLY) {

      // If your control can fit within these bounds return that

      // value.

      result = specSize;

      return result;

      }

    展开全文
  • 主要介绍了Android View.onMeasure方法详解及实例的相关资料,需要的朋友可以参考下
  • OnMeasure方法详解

    2015-10-14 20:29:17
    在自定义view中,我们会遇到最重要的三个方法。OnMeasure,OnLayout OnDraw。OnLayout决定了在ViewGroup中的位置。...先来看下TextView中的OnMeasure方法:  @Override   protected void o

      在自定义view中,我们会遇到最重要的三个方法。OnMeasure,OnLayout  OnDraw。OnLayout决定了在ViewGroup中的位置。 OnDraw决定了如何绘制这个view。而在这里要介绍的OnMeasure决定了View的大小。 

    先来看下TextView中的OnMeasure方法:

    1.     @Override  
    2.     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  
    3.         int widthMode = MeasureSpec.getMode(widthMeasureSpec);  
    4.         int heightMode = MeasureSpec.getMode(heightMeasureSpec);  
    5.         int widthSize = MeasureSpec.getSize(widthMeasureSpec);  
    6.         int heightSize = MeasureSpec.getSize(heightMeasureSpec);  
    7.   
    8.         int width;  
    9.         int height;  
    10.   
    11.         ...   
    12.   
    13.         if (widthMode == MeasureSpec.EXACTLY) {  
    14.             // Parent has told us how big to be. So be it.  
    15.             width = widthSize;  
    16.         } else {  
    17.             if (mLayout != null && mEllipsize == null) {  
    18.                 des = desired(mLayout);  
    19.             }  
    20.   
    21.         ...  
    22.   
    23.         setMeasuredDimension(width, height); 
    首先要先明白是谁调用了onMeasure()这个方法。 调用它的是这个view的父视图。widthMeasureSpec和heightMeasureSpec这两个参数由其父视图viewGroup的layout_height,layout_width,padding以及本身的layout_margin,layout_width,layout_height共同决定(其实还与widght权重有关,但是这个比较复杂先忽略它)。 
    接着要来说一下widthMeasureSpec的组成结构,它包含了两部分,Mode and Size. 你可以会奇怪为啥一个Int能包含两部分信息。 其实它是一个32位的,高两位用于表示Model,低30位表示Size。 Model由本身view和Viewgroup的layout_width有关,Size与ViewGroup中得Padding,本身的margin,layout_width。
    先来说说Model,它有三种状态:
    exactly精确状态01:MeasureSpec.EXACTLY:view就为本身指定的大小,再xml中定义的为MATCH_PARENT时model对应于EXACTLY
    at_most最大状态00:MeasureSpec.AT_MOST:view的大小不得大于VIewGroup的大小,再xml中定义的为WRAP_CONTENT对应为于AT_MOST
    unspecified为指明状态10:MeasureSpec.UNSPECIFIED: view的大小不受限制,当view设置为制定大小时情况对应这种
    32位的数字解析出来稍微有点麻烦,所以Google官方也提供了几个方法来获取Model 和Size——MeasureSpec.getModel和MeasureSpec.getSize。 如下的代码是一个列子,注意了setMeasuredDimension(width,height)这里的高宽才是最后真真的大小。

    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int widthMode = MeasureSpec.getMode(widthMeasureSpec);
        int widthSize = MeasureSpec.getSize(widthMeasureSpec);
        int heightMode = MeasureSpec.getMode(heightMeasureSpec);
        int heightSize = MeasureSpec.getSize(heightMeasureSpec);
        Log.e("Measure",MeasureSpec.toString(widthMeasureSpec));
        int width;
        int height;
        if (widthMode == MeasureSpec.EXACTLY) {
            width = widthSize;
        } else {
            mPaint.setTextSize(mTitleTextSize);
            mPaint.getTextBounds(mTitleText, 0, mTitleText.length(), mBound);
            float textWidth = mBound.width();
            int desired = (int) (getPaddingLeft() + textWidth + getPaddingRight());
            width = desired;
        }
    
        if (heightMode == MeasureSpec.EXACTLY) {
            height = heightSize;
        } else {
            mPaint.setTextSize(mTitleTextSize);
            mPaint.getTextBounds(mTitleText, 0, mTitleText.length(), mBound);
            float textHeight = mBound.height();
            int desired = (int) (getPaddingTop() + textHeight + getPaddingBottom());
            height = desired;
        }
    
    
        setMeasuredDimension(width, height);
    }

    在这里顺便提一下一种让listview或者gridview取消滚动栏方法的实现原理
    int expandSpec= MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE,MEASURESPEC.AT_MOST);
    super.onMeasure(widthMeasureSpec,expandSpec)
    makeMeasureSpec这个方法是传入size和model返回一个MeasureSpec值。还记得前面说的吗,高两位是model,低位是size,这里我们把最大的整形左移两位空出model的值,剩下的size部分就是30位的最大值了,即size为最大;然后我们又让model设置为AT_MOST即wrap_content有多大显示多大,这样view的高度就成了view本身有多大就显示多大,就不会出现自带的滚动条了~
    展开全文
  • 本篇文章是对继承ViewGroup后的子类如何重写onMeasure方法进行了详细的分析介绍,需要的朋友参考下
  • onMeasure方法简介

    2013-01-16 16:21:05
    onMeasure方法在控件的父元素正要放置它的子控件时调用.它会问一个问题,“你想要用多大地方啊?”,然后传入两个参数——widthMeasureSpec和heightMeasureSpec.  它们指明控件可获得的空间以及关于这个空间描述...

    onMeasure方法在控件的父元素正要放置它的子控件时调用.它会问一个问题,“你想要用多大地方啊?”,然后传入两个参数——widthMeasureSpec和heightMeasureSpec.

      它们指明控件可获得的空间以及关于这个空间描述的元数据.
      比返回一个结果要好的方法是你传递View的高度和宽度到setMeasuredDimension方法里.

      接下来的代码片段给出了如何重写onMeasure.注意,调用的本地空方法是来计算高度和宽度的.它们会译解widthHeightSpec和heightMeasureSpec值,并计算出合适的高度和宽度值.

    java代码:

    1. @Override
    2. protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

    3. int measuredHeight = measureHeight(heightMeasureSpec);
    4. int measuredWidth = measureWidth(widthMeasureSpec);
    5. setMeasuredDimension(measuredHeight, measuredWidth);
    6. }

    7. private int measureHeight(int measureSpec) {


    8. // Return measured widget height.
    9. }

    10. private int measureWidth(int measureSpec) {

    11. // Return measured widget width.
    12. }
    复制代码


           边界参数——widthMeasureSpec和heightMeasureSpec ,效率的原因以整数的方式传入。

          

         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方法里面调用但也有少数例外

     

           在它们使用之前,首先要做的是使用MeasureSpec类的静态方法getMode和getSize来译解,如下面的片段所示:

    java代码:

    1. int specMode = MeasureSpec.getMode(measureSpec);
    2. int specSize = MeasureSpec.getSize(measureSpec);
    复制代码


           依据specMode的值,如果是AT_MOST,specSize 代表的是最大可获得的空间;如果是EXACTLY,specSize 代表的是精确的尺寸;如果是UNSPECIFIED,对于控件尺寸来说,没有任何参考意义。
      当以EXACT方式标记测量尺寸,父元素会坚持在一个指定的精确尺寸区域放置View。在父元素问子元素要多大空间时,AT_MOST指示者会说给我最大的范围。在很多情况下,你得到的值都是相同的。
      在两种情况下,你必须绝对的处理这些限制。在一些情况下,它可能会返回超出这些限制的尺寸,在这种情况下,你可以让父元素选择如何对待超出的View,使用裁剪还是滚动等技术。

      接下来的框架代码给出了处理View测量的典型实现:

    java代码:

    1. @Override

    2. protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

    3. int measuredHeight = measureHeight(heightMeasureSpec);

    4. int measuredWidth = measureWidth(widthMeasureSpec);

    5. setMeasuredDimension(measuredHeight, measuredWidth);

    6. }

    7. private int measureHeight(int measureSpec) {

    8. int specMode = MeasureSpec.getMode(measureSpec);
    9. int specSize = MeasureSpec.getSize(measureSpec);

    10. // Default size if no limits are specified.

    11. int result = 500;
    12. if (specMode == MeasureSpec.AT_MOST){

    13. // Calculate the ideal size of your
    14. // control within this maximum size.
    15. // If your control fills the available
    16. // space return the outer bound.

    17. result = specSize;

    18. else if (specMode == MeasureSpec.EXACTLY){

    19. // If your control can fit within these bounds return that value.
    20. result = specSize;
    21. }

    22. return result;
    23. }

    24. private int measureWidth(int measureSpec) {
    25. int specMode = MeasureSpec.getMode(measureSpec);
    26. int specSize = MeasureSpec.getSize(measureSpec);

    27. // Default size if no limits are specified.
    28. int result = 500;
    29. if (specMode == MeasureSpec.AT_MOST){
    30. // Calculate the ideal size of your control
    31. // within this maximum size.
    32. // If your control fills the available space
    33. // return the outer bound.
    34. result = specSize;


    35. else if (specMode == MeasureSpec.EXACTLY){
    36. // If your control can fit within these bounds return that value.

    37. result = specSize;
    38. }

    39. return result;
    40. }
    展开全文
  • View测量之onMeasure方法

    2017-05-13 22:28:35
    自定义View有三个 方法可以调用,onLayout设置view的位置,onMeasure设置宽高,onDraw绘制view,这篇来写其中的一个OnMeasuer方法。在现实生活中,如果我们要...这个过程在onMeasure方法中进行。举个栗子来展示onMeasu
  • onMeasure方法在控件的父元素正要放置它的子控件时调用.它会问一个问题,“你想要用多大地方啊?”,然后传入两个参数——widthMeasureSpec和heightMeasureSpec. 它们指明控件可获得的空间以及关于这个空间描述的元...
  • 1、自定义控件首先定义一个类继承View 有时,Android系统控件无法满足我们的需求,因此有必要自定义View。...一般来说,自定义控件都会去重写View的onMeasure方法,因为该方法指定该控件在屏幕上的大小。 prot...
  • 为了满足设计需求,在自定义View时往往不可避免得要对onMeasure方法进行覆写,其中比较常规的写法就是使用MeasureSpec类的getSize和getMode方法获取到尺寸和模式,再进行相应的处理,最后通过setMeasuredDimension...
  • 自定义控件的onMeasure方法详解

    千次阅读 2016-01-28 10:22:26
    在我们自定义控件的时候可能你会用到onMeasure方法,下面就详细的给大家介绍一下这个方法: @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure...
  • View onMeasure方法介绍

    2014-04-14 14:35:00
    onMeasure方法在控件的父元素正要放置它的子控件时调用.它会问一个问题,“你想要用多大地方啊?”,然后传入两个参数——widthMeasureSpec和heightMeasureSpec. 它们指明控件可获得的空间以及关于这个空间描述的元...
  • android 的onMeasure方法

    2014-08-04 14:06:50
    在Android开发中,当Android原生控件不能满足...什么时候调用onMeasure方法? 当子View的父控件要放置该View的时候,父控件会传递两个参数给View——widthMeasureSpec和heightMeasureSpec。这两个参数是View可以获取的
  • onMeasure()方法的作用就是测量View需要多大的空间,就是宽和高。...onMeasure方法不就没有了吗? 其实不然,我们就知道,在xml布局文件中,我们的layout_width和layout_height参数可以不用写具体的尺寸...
  • Android的onMeasure方法

    千次阅读 2014-02-03 14:30:20
    在Android开发中,当Android原生控件不能满足我们的... 什么时候调用onMeasure方法?  当子View的父控件要放置该View的时候,父控件会传递两个参数给View——widthMeasureSpec和heightMeasureSpec。这两个参数是Vie
  • onMeasure方法在控件的父元素正要放置它的子控件时调用。它会问一个问题,“你想要用多大地方啊?”,然后传入两个参数——widthMeasureSpec和heightMeasureSpec。 它们指明控件可获得的空间以及关于这个空间描述的...
  • 在我们自己定义控件的时候可能你会用到onMeasure方法,以下就具体的给大家介绍一下这种方法: @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure...
  • 在开发中,当Android原生控件不... 什么时候调用onMeasure方法?  当子View的父控件要放置该View的时候,父控件会传递两个参数给View——widthMeasureSpec和heightMeasureSpec。这两个参数是View可以获取的宽高尺寸和
  • Android 自定义 view(四)—— onMeasure 方法理解 前言: 前面我们已经学过《Android 自定义 view(三)—— onDraw 方法理解》,那么接下我们还需要继续去理解自定义view里面的onMeasure 方法 推荐文章: ...
  • AndroidView.onMeasure方法的理解 View在屏幕上显示出来要先经过measure(计算)和layout(布局).1、什么时候调用onMeasure方法?当控件的父元素正要放置该控件时调用.父元素会问子控件一个问题,“你想要用多大...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,099
精华内容 1,239
关键字:

onmeasure方法