现在的位置: 首页 > 综合 > 正文

Android 计算控件尺寸

2013年05月27日 ⁄ 综合 ⁄ 共 1945字 ⁄ 字号 评论关闭

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;
  }

抱歉!评论已关闭.