View绘制

1、画图(//www.greatytc.com/p/060b5f68da79),结合艺术探索的总结、Hierarchy View的展示

解释下各层的意思,注意最后讲下ViewRoot--ViewRootImpl类,图中并没有展示

2、三大过程

总体说:measure、layout、draw

measure过程决定了View的宽高,可以通过getMeasuredWith和getMeasuredHeight来获取View测量后的宽高

layout过程决定了View四个顶点的坐标和实际的View的宽高,可以通过getTop、getBottom、getLeft、getRight来得到四个点坐标,getWith、getHeight来得到宽高

draw过程是将View的内容呈现到屏幕上

1、measure(最复杂的过程)

1、MeasureSpec类

1、测量规格,分为widthMeasureSpec、heightMeasureSpec,这个值确定View的宽高非常重要

2、一个32位int值,高2位代表测量模式SpecMode、低30位代表规格大小SpecSize,然后介绍下两种主要的测量模式和其对应的值

3、View的MeasureSpec由自身的布局参数LayoutParams和父容器的MeasureSpec共同决定的

2、View的measure过程

1、调用onMeasure(int widthMeasureSpec, int heightMeasureSpec)

其中的widthMeasureSpec和heightMeasureSpec就是由View的LayoutParams和父容器的MeasureSpec共同决定的,然后传入到这个函数里

2、setMeasuredDimension(int ,int )就是最终设置View的测量宽高

3、view默认的AT_MOST和EXACTLY模式作同样的处理,所以view要重写onMeasure函数对AT_MOST作另外处理,给它一个默认值

从而实现对wrap_content的支持

3、ViewGroup的measure过程

1、除了完成自己的measure过程,还通过measureChildren遍历调用所有子View的measure方法

(查看measureChildren方法中的measureChild方法可以看到,子view的MeasureSpec是由父容器的MeasureSpc和自身的LayoutParams,还有padding决定的)

2、ViewGroup是抽象类,没有实现自己的onMeasure()函数,而是由各个具体子类去实现,如LinearLayout、RelativeLayout

4、获取View的宽高

1、View的measure过程和Activity生命周期不是同步的,所以在OnCreate、OnStart、OnResume中均无法获取

2、简单使用的方法是,view.post(runnable),int width = view.getWidth()(布局后的实际宽度);

通过post将一个runnable投递到消息队列的尾部

2、layout

1、layout方法中调用setFrame(l, t, r, b)函数可以确定view本身的位置

2、layout方法中调用onLayout来确定子View的位置

3、getMeasureWidth和getWidth的关系,一个是测量值,一个是最终值(通过四个点坐标来计算),一般来讲这两个值是一样的

3、draw

1、主要有四个过程(一共有六个)

1、绘制背景

drawBackground(canvas);

2、绘制自己

onDraw(canvas)

重点,通常重写此方法

3、绘制子View

dispatchDraw(canvas)

4、绘制装饰

(绘制边框,比如scrollbars,其实每一个view,比如TextView也是有滚动条的,只是设置的显示或者不显示,或者gone)

2、View的onDraw()函数默认为空,由继承它的子类去实现

3、Canvas和Paint

1、Canvas,可以理解为画布,可以画圆、画矩形、画弧、画线、写字等,有很多函数。

2、Paint,可以理解为画笔,可以设置颜色、风格等。

4、设置对padding的支持

4、从以上的总结来推测一下什么情况下影响UI效率

1、measure过程主要受子view个数影响?

另外非常值得注意的是,RelativeLayout会进行两次测量,LinearLayout中使用layout_weight会进行两次测量

2、layout过程主要受布局嵌套深度影响?

减少嵌套深度是优化布局非常重要的一个点(层次深的话会多调用onLayout函数,onLayout函数一般会比较复杂,而setFrame本身并不复杂)

3、draw过程

四个过程都可能影响绘制时间,比如背景图片太大等

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

推荐阅读更多精彩内容