Android measure和layout的一点理解
首先,推荐文章,http://blog.csdn.net/hqdoremi/article/details/9980481,http://www.docin.com/p-571954086.html
我理解measure的作用有2个:一个就是调用子view的measure函数,生成他们的高度和宽度,以便在自己的layout阶段参考;另一个是为父view提供关于自己的测量的width和height(这个宽度和高度往往和子view的测量高度和宽度有关),以便父view在layout阶段参考。
onMeasure 中,一般是先调用measureChildren让子view先确定自己的大小,再分别调用getMeasuredWidth()获得测量出的大小,随后使用setMeasuredDimension函数设定自身的大小。measureChildren方法会传入widthMeasureSpec和heightMeasureSpec,表示当前view对子view的大小约束,子view根据这个限制和自身的约束(比如写在layout文件中的具体尺寸),就能确定具体的大小了。确定方法如下(借用一个图):
layout的作用就是布局子view的大小位置,这里可以使用刚才测量出的width和height,也可以不使用(当然,系统自带的布局都是使用的,因为这是推荐的规范做法),这完全取决于你想实现的布局效果(比如我可以知道子view的确定位置,就可以直接调用子view的layout函数定位,根本不用什么测量值),所以measure产生的mMeasuredWidth和mMeasuredHeight仅仅是参考用的。
把measure和layout分开,更方便重用系统控件。比如ListView不想使用滚动条,想把内容全部现实出来,就可以简单地重写一个onMeaure函数,继续使用默认的onLayout函数。代码如下:
public class NoScrollListView extends ListView{
public NoScrollListView(Context context, AttributeSet attrs) {
super(context, attrs);
} public void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
int mExpandSpec = View.MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> , View.MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, mExpandSpec);
}
}
这里的onMeaure,修改了父view对listview的高度说明,改为“最多达到最大整数值”,其实就意味着当父view布局这个listview时,分配的高度,是不受父view高度限制了(感觉listview之所以出现滚动条,是在onMeasure中根据父view的大小来判断的),所以listview会把内容全部加载到了父view上,没有了滚动条,当然,超过父view的地方看不见,需要配合scrollview使用。
Android measure和layout的一点理解的更多相关文章
- Android自己定义view之measure、layout、draw三大流程
自己定义view之measure.layout.draw三大流程 一个view要显示出来.须要经过測量.布局和绘制这三个过程,本章就这三个流程具体探讨一下.View的三大流程具体分析起来比較复杂,本文 ...
- 源码分析篇 - Android绘制流程(二)measure、layout、draw流程
performTraversals方法会经过measure.layout和draw三个流程才能将一帧View需要显示的内容绘制到屏幕上,用最简化的方式看ViewRootImpl.performTrav ...
- Activtiy完全解析(三、View的显示过程measure、layout、draw)
转载请标明出处: http://blog.csdn.net/xmxkf/article/details/52840065 本文出自:[openXu的博客] 在Activity完全解析的第一篇文章A ...
- [深入理解Android卷一全文-第八章]深入理解Surface系统
由于<深入理解Android 卷一>和<深入理解Android卷二>不再出版.而知识的传播不应该由于纸质媒介的问题而中断,所以我将在CSDN博客中全文转发这两本书的全部内容. ...
- Android高手进阶:Adapter深入理解与优化
一般是针对包含多个元素的View,如ListView,GridView,ExpandableListview,的时候我们是给其设置一个Adapter.Adapter是与View之间提供数据的桥梁,也是 ...
- 对于android触摸事件模型的一些理解
body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI& ...
- [深入理解Android卷一全文-第十章]深入理解MediaScanner
由于<深入理解Android 卷一>和<深入理解Android卷二>不再出版,而知识的传播不应该由于纸质媒介的问题而中断.所以我将在CSDN博客中全文转发这两本书的全部内容. ...
- opencv笔记5:频域和空域的一点理解
time:2015年10月06日 星期二 12时14分51秒 # opencv笔记5:频域和空域的一点理解 空间域和频率域 傅立叶变换是f(t)乘以正弦项的展开,正弦项的频率由u(其实是miu)的值决 ...
- android.intent.action.MAIN 与 android.intent.category.LAUNCHER 的验证理解 (转)
原文地址:android.intent.action.MAIN 与 android.intent.category.LAUNCHER 的验证理解 作者: 第一种情况:有MAIN,无LAUNCHER,程 ...
随机推荐
- WEB版一次选择多个文件进行批量上传(Plupload)的解决方案
WEB版一次选择多个文件进行批量上传(Plupload)的解决方案 转载自http://www.cnblogs.com/chillsrc/archive/2013/01/30/2883648.htm ...
- 【前端】Sublime text3 插件LiveReload 实现实时预览
1.首先要安装插件LiveReload Sublime text3. 菜单 preferences->packages control,输入install.. 回车,输入LiveReload回车 ...
- 【HDU 5387】Clock
题 Description Give a time.(hh:mm:ss),you should answer the angle between any two of the minute.hour. ...
- linux 问答
问:1 如何查看当前的Linux服务器的运行级别? 答: ‘who -r’ 和 ‘runlevel’ 命令可以用来查看当前的Linux服务器的运行级别. 问:2 如何查看Linux的默认网关? 答: ...
- jdbcTemplate的配置
相关jar 包 package sfk.bbs.test.springjsbctempletTest; import static org.junit.Assert.*; import java.sq ...
- Android学习笔记03-搭建Win8下的Android开发环境
一 配置环境变量 (绿色文字标出代码,路径换为自己的SDK路径) ANDROID_HOME = C:\software\adt-bundle-windows-x86_64-20140702\sdk ...
- POJ1845Sumdiv(求所有因子和 + 唯一分解定理)
Sumdiv Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 17387 Accepted: 4374 Descripti ...
- POJ1703Find them, Catch them
Find them, Catch them Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 37722 Accepted: ...
- electron加载jquery报错问题
<!-- Insert this line above script imports --> <script>if (typeof module === 'object') { ...
- 锋利的jQuery-3--$()创建节点
创建节点可以用jquery的工厂函数,$() $() 会根据传入的html标记字符串,创建一个dom对象,并将这个dom对象包装成一个jquery对象后返回. var li_1 = $("& ...