Android 控件onMeasure方法详解
measure:测量的意思
1、onMeasure会在该控件的父控件放置该控件时被调用
重写onMeasure(int widthMeasureSpec, int heightMeasureSpec)
int specModeH = MeasureSpec.getMode(heightMeasureSpec);
int specModeW = MeasureSpec.getMode(widthMeasureSpec);
MeasureSpec.getMode(int)会有三个值向对应
如果是AT_MOST,specSize 代表的是最大可获得的空间;
如果是EXACTLY,specSize 代表的是精确的尺寸;
如果是UNSPECIFIED,对于控件尺寸来说,没有任何参考意义
MeasureSpec有3种模式分别是UNSPECIFIED, EXACTLY和AT_MOST
2、那么这些模式和我们平时设置的layout参数fill_parent, wrap_content有什么关系呢?
经过代码测试就知道,当我们设置width或height为fill_parent时,容器在布局时调用子 view的measure方法传入的模式是EXACTLY,因为子view会占据剩余容器的空间,所以它大小是确定的。
而当设置为 wrap_content时,容器传进去的是AT_MOST, 表示子view的大小最多是多少,这样子view会根据这个上限来设置自己的尺寸。当子view的大小设置为精确值时,容器传入的是EXACTLY, 而MeasureSpec的UNSPECIFIED模式目前还没有发现在什么情况下使用。
View的onMeasure方法默认行为是当模式为UNSPECIFIED时,设置尺寸为mMinWidth(通常为0)或者背景drawable的最小尺寸,当模式为EXACTLY或者AT_MOST时,尺寸设置为传入的MeasureSpec的大小。
有个观念需要纠正的是,fill_parent应该是子view会占据剩下容器的空间,而不会覆盖前面已布局好的其他view空间,当然后面布局子 view就没有空间给分配了,所以fill_parent属性对布局顺序很重要。以前所想的是把所有容器的空间都占满了,难怪google在2.2版本里把fill_parent的名字改为match_parent
在两种情况下,你必须绝对的处理这些限制。在一些情况下,它可能会返回超出这些限制的尺寸,在这种情况下,你可以让父元素选择如何对待超出的View,使用裁剪还是滚动等技术。
setMeasuredDimension(400, 300);
这句代码可以指定该控件的宽高
相关推荐
Android 自定义view,覆写onMeasure例子
博客在: http://blog.csdn.net/ethan_xue/article/details/7401163
对View的量测原理进行了非常详尽的介绍,并且给出了一个示例进行解释
Android View.onMeasure方法详解及实例 View在屏幕上显示出来要先经过measure(计算)和layout(布局). 1、什么时候调用onMeasure方法? 当控件的父元素正要放置该控件时调用.父元素会问子控件一个问题,“你想...
主要介绍了Android 重写ViewGroup 分析onMeasure()和onLayout()方法的相关资料,需要的朋友可以参考下
onLayout在Android中view如何完成绘制这个过程介绍了很多,但是很多理论化的东西,最近重新整理一下,通俗的讲解一下。View绘制过程就好比你向银行贷款, 在Android中view如何完成绘制这个过程介绍了很多,但是很多...
近期做项目碰到ScrollView与Listview冲突的情况,查看了网上一些解决listview和scollView的冲突的方法,最终选择了重写onMeasure的方法来解决这个问题。 在此对各种方法做一个个人的总结评价。 主要的方法有四种: ...
博客《FlowLayout详解(一)——onMeasure()与onLayout()》对应源码,博客地址:http://blog.csdn.net/harvic880925/article/details/47029169
主要介绍了Android ListView 和ScroolView 出现onmeasure空指针的解决办法的相关资料,需要的朋友可以参考下
SearchView源码解析 SearchView是一个搜索框控件,样式也挺好看的。这次解析主要围绕android...1.10 onMeasure 测量 2. 展望未来 1. 源码解析 v7版本:23.2.1 1.1 继承关系 java.lang.Object ↳ android
如何用onDraw和onMeasure自定义view
a、创建一个Android项目,然后创建一个FlowLayout继承于ViewGroup: public class FlowLayout extends ViewGroup { /** 因为只在代码中直接new,所以创建这个构造方法就可以了 */ public FlowLayout(Context ...
SquareImageView English on the bottom ...This is a squera ImageView On Android Usage: 1: copy SqueraImageView to your project. 2: setting the width to a value, and height to any value on the XML fi
[快速理解android View的测量onMeasure()与MeasureSpec](http://blog.csdn.net/double2hao/article/details/51553703) ###2、Layoutparams以及MarginLayoutParams [Android开发:LayoutParams的用法]...
打开Profiler,发现程序cpu占用居高不下, record之后,发现占用cpu90%以上时间的是onmeasure和childLayout方法。开始分析,最终定位到一个自定义的view上。 这个自定义view在onDraw方法中,调用了一个很不起眼的...
Android仿抖音小视频点赞功能,在这个小程序中,我们创建了全屏的activity,参照Android系统的VideoView的onMeasure方法,relativelayout中无法全屏,要嵌套一个linearlayout,还创建了MediaPlayer统一管理模块,...
首先考虑的是这样实现比较简单,代码量不多,简单易懂,不用涉及AdapterView里的一些复杂View显示方法(onMeasure,onLayout等),回收算法也是采用相对简单实用的方式,虽然那个现在还有Bug,就是突然刷新到第一页的...
DrawingView的原型来自DrawingView-Android,是android的一个可涂鸦控件。 之所以做这个控件是因为前段时间写了一个截图应用需要用到涂鸦功能,现在把涂鸦的控件单独拿出来写一个demo。 这个控件代码超简单的哦,还...