`

View类的onMeasure方法介绍

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

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类的静态方法getMode和getSize来译解,如下面的片段所示:

int specMode = MeasureSpec.getMode(measureSpec);
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中的View.onMeasure()
http://blog.sina.com.cn/s/blog_4b650d650100nrhr.html
分享到:
评论

相关推荐

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

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

    Android View.onMeasure方法详解及实例

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

    覆写onMeasure例子

    "覆写onMeasure例子"这个标题指的是在自定义View时,我们需要重写`onMeasure()`方法来精确控制视图的大小。这个过程是Android布局系统的关键部分,确保了每个View能够正确地在屏幕上占据其应有的空间。 在Android中...

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

    2、使用单个ListView的addHeaderView()方法(给listview设置顶部固定的一个view) 评价:比较简便的方法,但是如果顶部布局需要监听滑动事件,也不可取。 3、使用LinearLayout取代ListView(重写LinearLayout) ...

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

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

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

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

    view类详解

    - 1.1.3 View 类方法及接口详细介绍 - 1.1.4 Android 中 View 类相关常用控件举例 - 1.2 View 类的层次结构关系 2. Android 的屏幕元素体系 ViewGroup - 2.1 Android GUI 程序的屏幕的体系结构 - 2.1.1 体系...

    Android特效开发(可伸缩View带互相挤压效果)下

    2. **onMeasure()**:在这个方法中,我们需要遍历所有子View,根据它们的权重或者固定尺寸来计算每个子View的测量宽度和高度。同时,考虑到伸缩效果,可以为每个子View设置一个最小和最大尺寸。 3. **onLayout()**...

    自定义View和viewGroup

    开发者可以通过重写View或ViewGroup类的onMeasure、onLayout、onDraw方法来实现自定义的View或ViewGroup。下面我们将详细介绍View和ViewGroup的工作原理和实现方法。 View的工作原理 ------------- View的工作原理...

    android中View类的使用实例

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

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

    - `onMeasure()`方法用于计算View的尺寸,必须调用`setMeasuredDimension()`设置测量结果。 2. **绘制基础**: - 使用`Canvas`对象进行绘制,包括画线`drawLine()`, 画圆`drawCircle()`, 画矩形`drawRect()`等...

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

    Android自定义View绘制的方法及过程是Android开发中非常重要的一部分,本文将详细介绍Android自定义View绘制的方法及过程,包括onSizeChanged、onDraw、onMeasure顺序的解释。 在Android中,自定义View的绘制过程...

    View类详解

    下面着重介绍 View 类: 自定义 View 的常用方法有: * onFinishInflate():当 View 中所有的子控件均被映射成 xml 后触发 * onMeasure(int, int):确定所有子元素的大小 * onLayout(boolean, int, int, int, int)...

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

    在 onMeasure() 方法中,还需要调用孩子的 measure() 方法,来测量出 view 的大小。父 view 使用 width 参数和 height 参数来提供约束信息。实际上,view 的测量工作在 onMeasure() 方法中完成。 onLayout() 方法:...

    View的绘制过程

    在`onMeasure()`方法中,View会根据这些规格计算自己的实际大小。对于ViewGroup,如LinearLayout,它需要考虑自身以及所有子View的大小,因此通常需要重写`onMeasure()`来执行复杂的测量逻辑。基类View的`onMeasure...

    自定义View源代码

    - `onMeasure()`方法用于计算自定义View的大小,需要考虑父View的约束和自身的布局参数。 - `onLayout()`方法用于确定子View的位置。 7. **性能优化**: - 使用`canvas.save()`和`canvas.restore()`来减少不必要...

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

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

    解析:继承ViewGroup后的子类如何重写onMeasure方法

    `onMeasure()`方法是自定义ViewGroup时必须重写的一个核心方法,它负责测量并确定子View的大小。本文将深入解析如何在继承ViewGroup的子类中正确地重写`onMeasure()`方法。 `onMeasure()`方法的主要任务是计算出...

    自定义开关View绘制流程

    测量 摆放 绘制 * measure -> layout -> draw * | | | * onMeasure -> onLayout -> ... * onMeasure() (指定自己的宽高, 所有子View的宽高)-> onLayout() (摆放所有子View) -> onDraw() (绘制内容)

Global site tag (gtag.js) - Google Analytics