`
zhouxiaoli521
  • 浏览: 561646 次
  • 性别: 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方法详解和例子解释

    在Android开发中,`onMeasure()`方法是布局和视图尺寸计算的核心,它负责确定一个View的精确宽度和高度。本文将深入解析`onMeasure()`的工作原理,通过一个实例来帮助理解这一关键过程。 首先,`onMeasure()`方法在...

    Android View.onMeasure方法详解及实例

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

    android自定义组件(七) onMeasure测量尺寸

    `onMeasure`方法在Android的View类中被定义,它是测量组件大小的核心方法。当一个View或ViewGroup需要确定其子视图的尺寸时,会调用这个方法。通常,自定义组件需要重写`onMeasure`以确保它们能正确地根据内容或特定...

    覆写onMeasure例子

    在Android中,`onMeasure()`方法用于测量View的尺寸,它决定了View的宽度和高度。通常,我们会在自定义View中覆写这个方法,以便根据内容或者特定需求计算出合适的大小。下面将详细介绍`onMeasure()`的工作原理以及...

    android 自定义View类的简单使用 示例

    在Android开发中,自定义View类是实现个性化界面和复杂交互功能的重要手段。这篇博客将带你深入了解如何简单地使用自定义View,并通过一个具体的示例进行讲解。文章链接为,尽管描述部分为空,但我们可以根据标题和...

    android View下的继承关系

    "android View下的继承关系"这个主题深入探讨了Android视图系统中View类及其子类的层次结构,帮助开发者理解如何构建和定制用户界面。在这个体系中,Widget(控件)是View的一个重要子类,用于创建各种UI组件。 ...

    android 自定义view比较综合的例子

    4. 可能需要重写onMeasure()方法,以确定View的尺寸,遵循MeasureSpec规则。 5. 对于交互性,可能需要覆盖onTouchEvent()来处理触摸事件。 自定义View时,你可能会遇到以下复杂实现: 1. 属性动画和视图动画:为了...

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

    Android 重写ViewGroup 中onMeasure()和onLayout()方法详解 Android 中的 ViewGroup 是一个抽象类,继承自 View,提供了基本的布局管理功能。为了提供更好的自定义布局,需要重写 ViewGroup 中的两个重要方法:...

    Android中View绘制流程

    1. **onMeasure()**:此方法用于确定View的大小。每个View都会调用该方法来测量自身的宽高,通常会根据其父View的约束和自身的MeasureSpec进行计算。MeasureSpec包含了父View期望的大小和模式,这有助于确定View的...

    android 自定义View 实例

    `onMeasure()`方法需要设置View的宽度和高度,确保其在布局中正确显示。例如: ```java @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int widthSize = MeasureSpec.get...

    android中View类的使用实例

    下面将详细介绍`View`类的基本使用和实例。 1. **创建自定义View** 在Android中,你可以通过继承`View`或其子类(如`TextView`, `Button`等)来创建自定义视图。首先,你需要创建一个新的Java类,然后重写关键方法...

    AndroidView生命周期(图)

    在Android开发中,View是构建用户界面的基本元素,它的生命周期管理对于优化性能和避免资源浪费至关重要。本篇文章将深入探讨Android View的生命周期,结合描述中的“对比xml三种visibility和在java中new的生命周期...

    在android里面通过view画线

    此外,为了使视图能够立即渲染,我们需要在Activity的`onCreate()`方法中调用`setWillNotDraw(false)`,并确保在`onMeasure()`方法中正确地设置了View的尺寸: ```java @Override protected void onCreate(Bundle ...

    Android自定义View,View中的原点坐标相关问题

    可以查看`View`类的源代码,了解`onDraw()`, `onMeasure()`, `onLayout()`等方法的工作原理。例如,`measure()`方法是如何计算出View的尺寸,`layout()`方法又是如何根据尺寸和父容器设置View的位置。 工具方面,...

    android view

    `View`类提供了设置大小、位置、背景、边框等属性的方法。 2. **View的生命周期** `View`有自己的生命周期,包括创建、测量、布局和绘制等阶段。在`onMeasure()`方法中,`View`确定自己的尺寸;`onLayout()`中,它...

    Android 自定义View视图

    4. **测量大小**:自定义View还需要重写`onMeasure(int widthMeasureSpec, int heightMeasureSpec)`方法,以确定视图在屏幕上的大小。在这里,我们需要计算出罗盘应有的尺寸,确保其可以正确显示。 5. **响应触摸...

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

    `onMeasure`方法是每个View都必须重写的方法,用于确定View自身的宽高。它需要调用`setMeasuredDimension`来设定测量结果,通常根据MeasureSpec(测量规格)来进行。MeasureSpec包含了父View对子View的尺寸约束,...

    Android自定义view——组合控件

    一个自定义View通常继承自Android的View或者ViewGroup类。如果我们的控件是单一的,如一个按钮或文本框,那么我们选择继承View;如果需要包含多个子视图并管理它们的布局,那么应该继承ViewGroup,如LinearLayout或...

    android 自定义View 两种方式

    在新的类中,你可以重写`onDraw()`方法来绘制自定义的图形,或者覆盖其他方法如`onMeasure()`以实现自定义的尺寸计算。同时,可以添加额外的属性和方法来满足特定需求。完成自定义View类后,在Activity的`onCreate()...

Global site tag (gtag.js) - Google Analytics