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

Android View类的onMeasure方法介绍

 
阅读更多

除非你总是需要一个100×100像素的控件,否则,你必须要重写onMeasure。 

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

比返回一个结果要好的方法是你传递View的高度和宽度到setMeasuredDimension方法里。 
接下来的代码片段给出了如何重写onMeasure。注意,调用的本地空方法是来计算高度和宽度的。它们会译解widthHeightSpec和heightMeasureSpec值,并计算出合适的高度和宽度值。 

Java代码  收藏代码
  1. @Override  
  2. protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  
  3.   
  4. int measuredHeight = measureHeight(heightMeasureSpec);  
  5.   
  6. int measuredWidth = measureWidth(widthMeasureSpec);  
  7.   
  8. setMeasuredDimension(measuredHeight, measuredWidth);  
  9.   
  10. }  
  11.   
  12. private int measureHeight(int measureSpec) {  
  13.   
  14. // Return measured widget height.  
  15.   
  16. }  
  17.   
  18. private int measureWidth(int measureSpec) {  
  19.   
  20. // Return measured widget width.  
  21.   
  22. }  


边界参数——widthMeasureSpec和heightMeasureSpec ,效率的原因以整数的方式传入。在它们使用之前,首先要做的是使用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.   
  4. int measuredHeight = measureHeight(heightMeasureSpec);  
  5.   
  6. int measuredWidth = measureWidth(widthMeasureSpec);  
  7.   
  8. setMeasuredDimension(measuredHeight, measuredWidth);  
  9.   
  10. }  
  11.   
  12. private int measureHeight(int measureSpec) {  
  13.   
  14. int specMode = MeasureSpec.getMode(measureSpec);  
  15. int specSize = MeasureSpec.getSize(measureSpec);  
  16.   
  17. // Default size if no limits are specified.  
  18.   
  19. int result = 500;  
  20.   
  21. if (specMode == MeasureSpec.AT_MOST)   
  22.   
  23. {  
  24.   
  25. // Calculate the ideal size of your  
  26.   
  27. // control within this maximum size.  
  28.   
  29. // If your control fills the available  
  30.   
  31. // space return the outer bound.  
  32.   
  33. result = specSize;  
  34.   
  35. }   
  36.   
  37. else if (specMode == MeasureSpec.EXACTLY)   
  38.   
  39. {  
  40.   
  41. // If your control can fit within these bounds return that value.  
  42.   
  43. result = specSize;  
  44.   
  45. }  
  46.   
  47. return result;  
  48.   
  49. }  
  50.   
  51. private int measureWidth(int measureSpec) {  
  52.   
  53. int specMode = MeasureSpec.getMode(measureSpec);  
  54. int specSize = MeasureSpec.getSize(measureSpec);  
  55.   
  56. // Default size if no limits are specified.  
  57.   
  58. int result = 500;  
  59.   
  60. if (specMode == MeasureSpec.AT_MOST)  
  61.   
  62. {  
  63.   
  64. // Calculate the ideal size of your control  
  65.   
  66. // within this maximum size.  
  67.   
  68. // If your control fills the available space  
  69.   
  70. // return the outer bound.  
  71.   
  72. result = specSize;  
  73.   
  74. }   
  75.   
  76. else if (specMode == MeasureSpec.EXACTLY)   
  77.   
  78. {  
  79.   
  80. // If your control can fit within these bounds return that value.  
  81.   
  82. result = specSize;  
  83.   
  84. }  
  85.   
  86. return result;  
  87.   
  88. }  




Android中的View.onMeasure() 
http://blog.sina.com.cn/s/blog_4b650d650100nrhr.html

 

http://gundumw100.iteye.com/blog/999767

 

 

 

分享到:
评论

相关推荐

    Android View 的onMeasure方法详解和例子解释

    对View的量测原理进行了非常详尽的介绍,并且给出了一个示例进行解释

    Android View.onMeasure方法详解及实例

    Android View.onMeasure方法详解及实例 View在屏幕上显示出来要先经过measure(计算)和layout(布局). 1、什么时候调用onMeasure方法? 当控件的父元素正要放置该控件时调用.父元素会问子控件一个问题,“你想...

    覆写onMeasure例子

    Android 自定义view,覆写onMeasure例子

    onMeasure简单方法 完美解决ListView与ScollView!

    近期做项目碰到ScrollView与Listview冲突的情况,查看了网上一些解决listview和scollView的冲突的方法,最终选择了重写onMeasure的方法来解决这个问题。 在此对各种方法做一个个人的总结评价。 主要的方法有四种: ...

    自定义view,父容器无限onmeasure、 onlayout

    打开Profiler,发现程序cpu占用居高不下, record之后,发现占用cpu90%以上时间的是onmeasure和childLayout方法。开始分析,最终定位到一个自定义的view上。 这个自定义view在onDraw方法中,调用了一个很不起眼的...

    Android UI开发专题(四) View自绘控件

    首先我们需要了解下View类的底层实现,在SDK中我们可以看到View直接继承于Java的基类Object,实现了图形绘制和按键事件Drawable.Callback KeyEvent.Callback的相关方法,我们自绘时主要实现其内部的onDraw方法,相关...

    Android下如何理解onMeasure,onLayout的过程

    onLayout在Android中view如何完成绘制这个过程介绍了很多,但是很多理论化的东西,最近重新整理一下,通俗的讲解一下。View绘制过程就好比你向银行贷款, 在Android中view如何完成绘制这个过程介绍了很多,但是很多...

    Android中自定义View之流式布局

    Android中自定义View之流式布局的Demo,代码中关键步骤并有注释原理解说,轻松掌握自定义View的onMeasure和onLayout的实现

    Android自定义View

    介绍如何自定义View,并重写onMeasure方法重新测量高度和宽度, 讲解MeasureSpec类的使用方法 详见博文 http://blog.csdn.net/a87b01c14/article/details/50359226

    自定义View的PPT

    自定义View的PPT,包含了Android里面自定义View的onMeasure,onLayout等知识点

    Android 重写ViewGroup 分析onMeasure()和onLayout()方法

    在继承ViewGroup类时,需要重写两个方法,分别是onMeasure和onLayout。 1,在方法onMeasure中调用setMeasuredDimension方法 void android.view.View.setMeasuredDimension(int measuredWidth, int measuredHeight) ...

    Android中onMesure研究(1)项目源码

    在负责的View中,onMeasure方法调用顺序测试程序。

    Android利用Paint自定义View实现进度条控件方法示例

    既然是自定义控件,本文的该控件是直接继承View,然后重写View的onMeasure和onDraw方法来实现。其中onMeasure主要作用是测量控件的宽/高。而onDraw则是将界面绘制到屏幕上。 从效果的效果上看,我们需要自定义一些...

    Android控件架构与自定义控件详解(二)——自定义View

    在自定义View时,我们通常会去重写onDraw()方法来绘制View的显示内容。如果该View还需要使用wrap_content属性,那么还必须重写onMeasure()方法。另外,通过自定义attrs属性,还可以设置新的属性配置值。

    android 实现FlowLayout 流线布局(自定义ViewGroup)

    [快速理解android View的测量onMeasure()与MeasureSpec](http://blog.csdn.net/double2hao/article/details/51553703) ###2、Layoutparams以及MarginLayoutParams [Android开发:LayoutParams的用法]...

    Android-自定义显示价格的PriceView

    如何用onDraw和onMeasure自定义view

    Android UI开发 View自绘控件 分享

    很多时候想要设计漂亮的Android UI,使用Android自带的控件无法满足我们的需要就要考虑自绘控件,在Android界面显示类View,可以通过继承扩展重写相关方法来实现我们的图形绘制。  首先我们需要了解下View类的底层...

    Android自定义View绘制的方法及过程(二)

    主要解析了Android自定义View绘制的方法及过程,介绍了onSizeChanged、onDraw、onMeasure顺序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    Android自定义view制作绚丽的验证码

    自定义view一直被认为android进阶通向高手的必经之路,其实自定义view好简单,自定义view真正难的是如何绘制出高难度的图形,这需要有好的数学功底(后悔没有好好学数学了~),因为绘制图形经常要计算坐标点及类似的...

Global site tag (gtag.js) - Google Analytics