`

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方法详解和例子解释

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

    Android View.onMeasure方法详解及实例

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

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

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

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

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

    覆写onMeasure例子

    Android 自定义view,覆写onMeasure例子

    自定义开关View绘制流程

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

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

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

    DIY_View-master.zip

    自定义view之cicle 根据自定义view的4个步骤来定义view 1.自定义属性 2.构造方法中获取该属性 3.重新onMeasure方法 4.重写onDraw方法

    自定义View的PPT

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

    Android自定义View

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

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

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

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

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

    Android中自定义View之流式布局

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

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

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

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

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

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

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

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

    废话不多说了,先给大家展示下自定义view效果图,如果大家觉得还不错的话,请继续往下阅读。 怎么样,这种验证码是不是很...写一个类继承View类; 重新View的构造方法; 测量View的大小,也就是重写onMeasure()方

    Android UI开发 View自绘控件 分享

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

    Android App开发中自定义View和ViewGroup的实例教程

    View Android所有的控件都是View或者View的子类,它其实表示的就是屏幕上的一块矩形区域,用一个Rect来表示,...View的Measure过程给我们暴露了一个接口onMeasure,方法的定义是这样的, protected void onMeasure(i

Global site tag (gtag.js) - Google Analytics