View的工作原理浅谈(知识总结)

这篇文章只是一个简单自定义知识总结,浅谈自定义View。
在学习自定义View之前我们先了解一下几个概念。

一 ViewRoot,DecorView

ViewRoot是什么? ViewRoot对应于ViewRootImpl类,看到了很多人写的是viewtree的根节点,其实它跟View没有任何关系,也不是ViewTree的根节点,ViewTree的根节点往往是DecorView,DecorView的根是PhoneWindow,所以ViewRoot不是ViewTree的根节点,ViewRoot将DecorView attach到PhoneWindow上,连接WindowManager和DecorView的纽带。


742015-20160507011816138-502436220 (1).png

二 View的绘制流程概括

View的绘制流程是从ViewRoot的performTraversals方法开始,然后调用onmeasure,onlayout,ondraw最终绘制出来view。(此处不做深入探讨,以后会分析)


X)W_JJ7O57M%$E8F71_1NOA.png
performTraversals的工作流程

performTraversals会依次调用

  • performMeasure---->measure--->onMeasure---->从父容器传递到子View
  • performLayout ---->layout ---->onLayout--->从从父容器传递到子View
  • performDraw--->draw---->onDraw--->从父容器传递到子View

三 Mearsure,Layout,Draw的工作流程

Mearsure

测量分为两种情况

  • view 的测量
  1. view的测量是通过measure的方法来测量的
  2. measure方法调用了onMeasure方法,传入参数MeasureSpec,其中 onMeasure方法对MeasureSpec进行处理
  3. onMeasure方法中调用了setMeasuredDimension()方法去设置View的具体宽高值
  4. getDefaultSize()此方法传入MeasureSpec,由此来确定宽高。
  • ViewGroup的测量
    1.先遍历去调用所有子元素的measure方法,各个子元素再递归去执行这个流程.
  1. ViewGroup结合自己的特性(比如竖直,水平等)给出自身的measure值。
    这里有一个重要的类需要解释那就是MeasureSpec
MeasureSpec

(选自开发艺术探索)
MeasureSpec代表一个32位int值,高2位代表SpecMode,低30位代表SpecSize,SpecMode是指测量模式,而specSize是指在某种测量模式下的规格大小。
其中SpecMode有三个类

  • UNSPECIFIED

父容器不对View有任何限制,要多大给多大,这种情况一般用于系统内部,表示一种测量的状态。

  • EXACTLY

父容器已经测量出View所需要的精确大小,这个时候View的最终大小就是SpecSize所指定的值。它对应于LayoutParams中的match_parent(填充父元素,因为父元素的大小是固定的所以也相当于是具体数值)和具体的数值这两种模式。

  • AT_MOST

父容器指定了一个可用大小即SpecSize,View大小不能大于这个值,(就是有最大限制)具体是什么值要看不同View的具体实现。它对应于LayoutParams中的Wrap_content

Layout

用来确定子元素的位置,当ViewGroup的位置被确定后,它在onLayout中会遍历所有的子元素并调用自身的layout方法,在layout方法中onLayout方法会被调用。layout方法确定View本身的位置,onLayout方法则会确定所有子元素的位置。

这里有一个小问题需要解释一下就是:getMeasuredHeight(getMeasuredWidth),和getHeight(getWidth)的区别

友情链接:Android开发之getMeasuredWidth和getWidth区别从源码分析

  1. getMeasuredWidth方法获得的值是setMeasuredDimension方法设置的值,它的值在measure方法运行后就会确定

  2. getWidth方法获得是layout方法中传递的四个参数中的mRight-mLeft,它的值是在layout方法运行后确定的

  3. 一般情况下在onLayout方法中使用getMeasuredWidth方法,而在除onLayout方法之外的地方用getWidth方法。

4.在几乎所有的情况下都是相等的。

draw

这个过程就比较简单了,就是根据上面的数据进行绘制到屏幕上。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容