android 中view的绘制过程
view的绘制过程中分别会执行:onMeasure(会多次)计算view的大小,OnLayout(),确定控件的大小和位置 onDraw()绘制view
当Activity获得焦点时,它将被要求绘制自己的布局,Android framework将会处理绘制过程,Activity只需提供它的布局的根节点。
绘制过程从布局的根节点开始,从根节点开始测量和绘制整个layout tree。
每一个ViewGroup负责要求它的每一个孩子被绘制,每一个View负责绘制自己。
因为整个树是按顺序遍历的,所以父节点会先被绘制,而兄弟节点会按照它们在树中出现的顺序被绘制。
绘制是一个两遍(two pass)的过程:一个measure pass和一个layout pass。
测量过程(measuring pass)是在measure(int, int)中实现的,是从树的顶端由上到下进行的。
在这个递归过程中,每一个View会把自己的dimension specifications传递下去。
在measure pass的最后,每一个View都存储好了自己的measurements,即测量结果。
第二个是布局过程(layout pass),它发生在layout(int, int, int, int)中,仍然是从上到下进行(top-down)。
在这一遍中,每一个parent都会负责用测量过程中得到的尺寸,把自己的所有孩子放在正确的地方。
尺寸的父子关系处理
当一个View对象的measure() 方法返回时,它的 getMeasuredWidth() 和getMeasuredHeight()值应该被设置好了,并且它的所有子孙的值也应该一起被设置好了。
一个View对象的measured width 和measured height的值必须考虑到它的父容器给它的限制。
这样就保证了在measure pass的最后,所有的parent都接受了它的所有孩子的measurements结果。
注意:一个parent可能会不止一次地对它的孩子调用measure()方法。
比如,第一遍的时候,一个parent可能测量它的每一个孩子,并没有指定尺寸,parent只是为了发现它们想要多大;
如果第一遍之后得知,所有孩子的无限制的尺寸总和太大或者太小,parent会再次对它的孩子调用measure()方法,这时候parent会设定规则,介入这个过程,使用实际的值。
(即,让孩子自由发展不成,于是家长介入)。
布局属性说明
LayoutParams是View用来告诉它的父容器它想要怎样被放置的参数。
最基本的LayoutParams基类仅仅描述了View想要多大,即指明了尺寸属性。
即View在XML布局时通常需要指明的宽度和高度属性。
每一个维度都可以指定成下列三种值之一:
1.FILL_PARENT (API Level 8之后重命名为MATCH_PARENT),表示View想要尽量和它的parent一样大(减去边距)。
2.WRAP_CONTENT,表示View想要刚好大到可以包含它的内容(包括边距)。
3.具体的数值。
ViewGroup的不同子类(不同的布局类)有相应的LayoutParams子类,其中会包含更多的布局相关属性。
onMeasure方法
onMeasure方法是测量view和它的内容,决定measured width和measured height的,这个方法由measure(int, int)方法唤起,子类可以覆写onMeasure来提供更加准确和有效的测量。
有一个约定:在覆写onMeasure方法的时候,必须调用setMeasuredDimension(int,int)来存储这个View经过测量得到的measured width and height。
如果没有这么做,将会由measure(int, int)方法抛出一个IllegalStateException。
onMeasure方法的声明如下:
protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec)
其中两个输入参数:
widthMeasureSpec
heightMeasureSpec
分别是parent提出的水平和垂直的空间要求。
这两个要求是按照View.MeasureSpec类来进行编码的。
参见View.MeasureSpec这个类的说明:这个类包装了从parent传递下来的布局要求,传递给这个child。
每一个MeasureSpec代表了对宽度或者高度的一个要求。
每一个MeasureSpec有一个尺寸(size)和一个模式(mode)构成。
MeasureSpecs这个类提供了把一个<size, mode>的元组包装进一个int型的方法,从而减少对象分配。当然也提供了逆向的解析方法,从int值中解出size和mode。
有三种模式:
UNSPECIFIED
这说明parent没有对child强加任何限制,child可以是它想要的任何尺寸。
EXACTLY
Parent为child决定了一个绝对尺寸,child将会被赋予这些边界限制,不管child自己想要多大。
AT_MOST
Child可以是自己任意的大小,但是有个绝对尺寸的上限。
覆写onMeasure方法的时候,子类有责任确保measured height and width至少为这个View的最小height和width。
(getSuggestedMinimumHeight() andgetSuggestedMinimumWidth())。
onLayout
这个方法是在layout pass中被调用的,用于确定View的摆放位置和大小。方法声明:
protected void onLayout (boolean changed, int left, int top, int right, int bottom)
其中的上下左右参数都是相对于parent的。
如果View含有child,那么onLayout中需要对每一个child进行布局。
android 中view的绘制过程的更多相关文章
- Android中View的绘制过程 onMeasure方法简述 附有自定义View例子
Android中View的绘制过程 onMeasure方法简述 附有自定义View例子 Android中View的绘制过程 当Activity获得焦点时,它将被要求绘制自己的布局,Android fr ...
- 【转】Android中View的绘制过程 onMeasure方法简述 附有自定义View例子
Android中View的绘制过程 当Activity获得焦点时,它将被要求绘制自己的布局,Android framework将会处理绘制过程,Activity只需提供它的布局的根节点. 绘制过程从布 ...
- Android 中View的绘制机制源代码分析 三
到眼下为止,measure过程已经解说完了,今天開始我们就来学习layout过程.只是在学习layout过程之前.大家有没有发现我换了编辑器,哈哈.最终下定决心从Html编辑器切换为markdown编 ...
- Android 中View的绘制机制源代码分析 一
尊重原创: http://blog.csdn.net/yuanzeyao/article/details/46765113 差点儿相同半年没有写博客了,一是由于工作比較忙,二是认为没有什么内容值得写, ...
- Android 中View的绘制机制源代码分析 二
尊重原创:http://blog.csdn.net/yuanzeyao/article/details/46842891 本篇文章接着上篇文章的内容来继续讨论View的绘制机制,上篇文章中我们主要解说 ...
- Android中View的绘制流程(专题讲解)
Android中的UI视图有两种方式实现:.xml文件(实现代码和UI的分离)和代码实现. Android的UI框架基本概念: 1. Activity:基本的页面单元,Activity包含一个Wind ...
- Android中View绘制流程以及invalidate()等相关方法分析
[原文]http://blog.csdn.net/qinjuning 整个View树的绘图流程是在ViewRoot.java类的performTraversals()函数展开的,该函数做的执行过程可简 ...
- Android中View绘制流程以及invalidate()等相关方法分析(转载的文章,出处在正文已表明)
转载请注明出处:http://blog.csdn.net/qinjuning 前言: 本文是我读<Android内核剖析>第13章----View工作原理总结而成的,在此膜拜下作者 .同时 ...
- Android中View绘制流程以及invalidate()等相关方法分析(转)
转自:http://blog.csdn.net/qinjuning 前言: 本文是我读<Android内核剖析>第13章----View工作原理总结而成的,在此膜拜下作者 .同时真挚地向渴 ...
随机推荐
- 服务器监控之 ping 监控
在运维人员的日常工作中,对物理服务器的监控十分重要.物理机的 CPU.内存.磁盘使用率,网卡流量,磁盘 IO 等都需要进行监控.通过 ICMP 协议的 ping 监控,可以判断物理服务器运行是否正常或 ...
- MySQL函数讲解(MySQL函数大全)
讲mysql函数之前先给大家展示一下利用mysql函数的一个例子: SELECT i.item_id, i.item_name, i.cid, i.last_update_time, u.url, u ...
- 如何才能学到Qt的精髓——信号槽之间的无关性,提供了绝佳的对象间通讯方式,QT的GUI全是自己的一套,并且完全开源,提供了一个绝好机会窥视gui具体实现
姚冬,中老年程序员 叶韵.KY Xu.赵奋强 等人赞同 被邀请了很久了,一直在思考,今天终于下决心开始写回答. 这个问题的确是够大的,Qt的代码规模在整个开源世界里也是名列前茅的,这么大的项目其中的精 ...
- Linux伙伴系统1
(一)--伙伴系统的概述 Linux内核内存管理的一项重要工作就是如何在频繁申请释放内存的情况下,避免碎片的产生.Linux采用伙伴系统解决外部碎片的问题,采用slab解决内部碎片的问题,在这里我们先 ...
- 九九乘法口诀引申出NN乘法口诀
package com.tfj.function; import java.util.Scanner; public class NNTable { public void method1(int n ...
- hduAnother Graph Game
http://acm.hdu.edu.cn/showproblem.php?pid=4647 很扯的一题 将每条边的一半权值分给它所连的两个结点 #include <iostream> # ...
- c程序设计语言_习题8-4_重新实现c语言的库函数fseek(FILE*fp,longoffset,intorigin)
fseek库函数 #include <stdio.h> int fseek(FILE *stream, long int offset, int origin); 返回:成功为0,出错 ...
- 【转】Ubuntu下配置支持Windows访问的samba共享
原文网址:http://blog.csdn.net/i_chips/article/details/19191957 一.安装Ubuntu samba服务器 $ sudo apt-get instal ...
- PHP位运算 详细说明
在实际应用中可以做用户权限的应用我这里说到的权限管理办法是一个普遍采用的方法,主要是使用到”位运行符”操作,& 位与运算符.| 位或运行符.参与运算的如果是10进制数,则会被转换至2进制数参与 ...
- 彻底解决:请求被中止: 未能创建 SSL/TLS 安全通道
最近有个项目要调用客户用java写的带https的webservice,对方提供了证书文件 test.pfx,我这里调用方式如下: //webservice代理类 SvcService svc = n ...