`
李村民
  • 浏览: 38886 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

MeasureSpec简介

阅读更多
onMeasure方法在控件的父元素正要放置它的子控件时调用。它会问一个问题,“你想要用多大地方啊?”,然后传入两个参数——widthMeasureSpec和heightMeasureSpec。它们指明控件可获得的空间以及关于这个空间描述的元数据。比返回一个结果要好的方法是你传递View的高度和宽度到setMeasuredDimension方法里。
    
  接下来的代码片段给出了如何重写onMeasure。注意,调用的本地空方法是来计算高度和宽度的。它们会译解widthHeightSpec和heightMeasureSpec值,并计算出合适的高度和宽度值。
  
  Java代码:
    @Override
  protectedvoidonMeasure(intwidthMeasureSpec,intheightMeasureSpec){
  
  
  intmeasuredHeight=measureHeight(heightMeasureSpec);
  intmeasuredWidth=measureWidth(widthMeasureSpec);
  setMeasuredDimension(measuredHeight,measuredWidth);
  }
  
  privateintmeasureHeight(intmeasureSpec){
  //高度测量窗口的回归.
  }
  
  privateintmeasureWidth(intmeasureSpec){
  //还测量窗口的宽度.
  }

  边界参数——widthMeasureSpec和heightMeasureSpec,效率的原因以整数的方式传入。在它们使用之前,首先要做的是使用MeasureSpec类的静态方法getMode和getSize来译解,如下面的片段代码所示:
  
  Java代码:
  intspecMode=MeasureSpec.getMode(measureSpec);
  intspecSize=MeasureSpec.getSize(measureSpec);

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

  @Override
  protectedvoidonMeasure(intwidthMeasureSpec,intheightMeasureSpec){
  intmeasuredHeight=measureHeight(heightMeasureSpec);
  intmeasuredWidth=measureWidth(widthMeasureSpec);
  setMeasuredDimension(measuredHeight,measuredWidth);
  }
  
  privateintmeasureHeight(intmeasureSpec){
  intspecMode=MeasureSpec.getMode(measureSpec);
  intspecSize=MeasureSpec.getSize(measureSpec);
  
  //如果没有限制默认大小是指定的.
  intresult=500;
  if(specMode==MeasureSpec.AT_MOST)
  {
  //你理想的大小的计算
  //在这个最大值控制.
  //如果你能控制的充满可用
  //外太空返回束缚.
  result=specSize;
  }
  elseif(specMode==MeasureSpec.EXACTLY)
  {
  //如果你的控制能符合这些界限返回那个价值.
  result=specSize;
  }
  returnresult;
  }
  
  privateintmeasureWidth(intmeasureSpec){
  intspecMode=MeasureSpec.getMode(measureSpec);
  intspecSize=MeasureSpec.getSize(measureSpec);
  
  //如果没有限制默认大小是指定的.
  intresult=500;
  if(specMode==MeasureSpec.AT_MOST)
  {
  //理想尺寸的计算你的控制
  //在这个最大的尺寸。
  //如果你的控制填充的可用空间
  //返回外面的束缚。
  result=specSize;
  }
  elseif(specMode==MeasureSpec.EXACTLY)
  {
  //如果你的控制能符合这些界限返回那个价值.
  result=specSize;
  }
  returnresult;
  }

的要求。一个MeasureSpec包含一个尺寸和模式。
有三种可能的模式:
UNSPECIFIED:父布局没有给子布局任何限制,子布局可以任意大小。
EXACTLY:父布局决定子布局的确切大小。不论子布局多大,它都必须限制在这个界限里。
AT_MOST:子布局可以根据自己的大小选择任意大小。

为了减少内存分配,MeasueSpecs用整数表示。这个类提供打包和解包<size,mode>元组为整型。参考方法:public static int makeMeasureSpec(int size,int mode)。
分享到:
评论
1 楼 zhaolin53636848 2011-10-12  
给我了一部分其实。但是还是不够特别具体。没基础的人不能完全看懂。不过还是感谢你的文章。

相关推荐

    Android开发艺术探索.任玉刚(带详细书签).pdf

    2.1 Android IPC简介 35 2.2 Android中的多进程模式 36 2.2.1 开启多进程模式 36 2.2.2 多进程模式的运行机制 39 2.3 IPC基础概念介绍 42 2.3.1 Serializable接口 42 2.3.2 Parcelable接口 45 2.3.3 Binder ...

    Android开发艺术探索

     2.1 Android IPC简介 / 35  2.2 Android中的多进程模式 / 36  2.2.1 开启多进程模式 / 36  2.2.2 多进程模式的运行机制 / 39  2.3 IPC基础概念介绍 / 42  2.3.1 Serializable接口 / 42  2.3.2 Parcelable...

    Android-CoffinLayout-仿燃兔APP的游戏详情界面

    2. 测量(Measure):在onMeasure()方法中,根据子View的MeasureSpec和父View的要求,计算每个子View的大小。 3. 布局(Layout):在onLayout()方法中,根据测量结果确定每个子View的位置。 4. 动画与过渡效果:为了增强...

    Android开发艺术探索1

    - **MeasureSpec**:MeasureSpec是尺寸约束,用于测量View的大小。 - **自定义View**:了解如何根据需求定制View,包括绘制逻辑、事件处理等,并注意性能优化。 5. **RemoteViews** - **应用**:RemoteViews主要...

    第四章 自定义组件、动画

    - **View简介**:View是Android UI的基础,所有可见的控件都继承自它,包括Button、TextView等。自定义View通常需要重写`onMeasure`和`onDraw`方法。 - **Android坐标系**:Android中有两种坐标系,一种是屏幕坐标...

    安卓图表报表相关-可自动调整的折线图.rar

    2. "JavaApk源码说明.txt":这可能是一个源代码的简介或者使用指南,包含了一些关于如何理解和使用源码的提示和注意事项。 3. "更多源码免费下载.url":这可能是一个链接,指向更多的免费源码资源,供开发者进一步...

    Android listview数据显示及提示信息的实例

    一、ListView 简介 ListView 是 Android 中的一个基本控件,用于显示列表数据。它可以显示大量数据,并且提供了许多有用的方法来处理列表数据。ListView 的使用非常广泛,例如联系人列表、消息列表、音乐列表等。 ...

Global site tag (gtag.js) - Google Analytics