Android_View和viewgroup测绘顺序

曾经面试时,面试官问了一个View和Viewgroup的测绘顺序,当时答的不是特别完美,今天总结下具体的顺序!

可能有童鞋说多简单啊不就是onMeasure onSizeChanged onLayout onDraw,

………加入一个ViewGroup里面放置了三个View,请说出log输出的具体顺序,附加一条,ondraw方法是谁通知他开始绘制的,以及ondraw中的canvas来自哪里?

好的现在开始我们今天的探索,看起来简单,但是不确定的知识点就是没掌握的知识点,自己弄明白不要模棱两可,感觉简单,却又不确定,这不是一个成长的小白改有的状态!!

  • 场景NO1,我们直接把activity的布局文件直接设置成我们的viewgroup,并且不给他设置任何背景色,里面也不要加入任何子view

    Log输出如下,

    我们可以看到只有一个viewgroup的时候,先执行了onMeasure,然后是onSizeChanged,然后是onlayout 确定自己的位置,因为没有任何绘制的东西所有没有触发ondraw,所以面对刚才那个问题,是不是发现onDraw并不是一定要执行的,但是上面三个方法确实要执行的.

  • 场景NO2,我们给我们刚才的跟布局加一个background属性,这里大家都能猜到执行顺序了吧,除啦和刚才的顺序一致,那就是ondraw方法也被触发了,这里有个疑问点,是哪个方法触发ondraw的?

  • 场景NO3,我们把背景色去掉,然后往里面加入一个子View.那么这回的执行顺序又是什么呢?

我们直接看下结果,

从log可以看到,当Viewgroup嵌套一个View的时候执行的顺序如下

=>>>>>View的onMeasure方法

=>>>>> ViewGroup的onMeasure方法

=>>>>>ViewGroup的onSizeChanged方法

=>>>>>View的onSizeChanged方法

=>>>>>View的onlayout方法确定自己在ViewGroup中的位置=>>>>>ViewGroup的onlayout方法确定自己的位置

=>>>>>View的ondraw方法绘制View

  • 此时我们再当前的基础上给viewgroup加入背景色,以及view加入背景色

    执行顺序接上面结果,如下我们看下绘制的顺序,

    我们看到先执行了viewgroup的ondraw方法,又执行了view的ondraw方法

  • 最后一个场景,我们往里面加入三个字view看下log输出,最后看下viewgroup和view一起的时候测量和绘制时怎么样的,大概在脑海里有个印象!

这是最后一个场景的预览图,我们可以根据之前的猜测下执行顺序

最后的log输出如下>>>>>>>>

这次我们的日志分组来看,

先执行onMeasure方法组,子view先执行,最后执行viewgroup的onMeasure

测绘结束后,执行onSizeChanged组,

这里需要注意的是,viewgroup先执行onSizeChanged方法,然后依次执行view的onSizeChanged方法,

然后就是onLayout组方法,

这一组先执行的是view的onlayout方法,然后是viewgroup的onLayout方法,

从上面的规律好像发现了什么,是不是猜到了最后ondraw的组的执行顺序,

那就是先执行viewgroup的onDraw.然后才是view的onDraw的方法..看下我们的预测怎么样!!

有没有,我们又猜对….到此view和viewgroup的侧绘方法顺序到此完毕

那么最后一个疑问请哪个大神帮忙回答下,ondraw方法中的canvas是从哪里来的,他的实质是什么,这个方法是哪个方法触发的,他的执行条件是什么?

ondraw里面的canvas经过群友指点,看View的源码中体现,是因为View里面有个一个静态内部类叫,AttachInfo,里面有一个mCanvas,

我们可以看到,canvas的来源是View中Attachinfo的静态内部类一个属性,

剩下的就是ondraw的触发了,源码只体现了,这个方法是一个protect方法,给子类自己实现的,但是我们自己定义完view后,他怎么样才能运行呢?是哪个方法执行完毕,或者是哪个事件触发的ondraw呢?

忘知情者,指点下!

时间: 2024-11-03 14:09:14

Android_View和viewgroup测绘顺序的相关文章

札记:android手势识别,MotionEvent

札记:android手势识别,MotionEvent 摘要 本文是手势识别输入事件处理的完整学习记录.内容包括输入事件InputEvent响应方式,触摸事件MotionEvent的概念和使用,触摸事件的动作分类.多点触摸.根据案例和API分析了触摸手势Touch Gesture的识别处理的一般过程.介绍了相关的GestureDetector,Scroller和VelocityTracker.最后分析drag和scale等一些手势的识别. 输入源分类 虽然android本身是一个完整的系统,它主要

Android View框架总结(六)View布局流程之Draw过程

转载请注明出处:http://blog.csdn.net/hejjunlin/article/details/52236145 View的Draw时序图 ViewRootImpl.performTraversals过程 ViewRootImpl.performDraw过程 View.draw方法 View.dispatchDraw过程 LinearLayout的onDraw过程 View的Draw时序图 前面几篇通过对View树的measure和layout过程分析事,接下来将结合前两步得到的测

android事件分发流程

1.描述 说到android事件的分发机制,真的是感觉既熟悉又陌生,因为每次需要用到的时候查看相关的源码,总能找到一些所以然来,但是要根据自己理解从头到尾说一遍,却一点都说不上.总结原因吧,感觉是自己不善于总结,过目就忘,并没有把心思放在上面,自然也就没有一点概念咯~~所以在这里主要是把自己理解的一些东西记录下来,不涉及源代码. 好吧,接下来简单说说android事件分发流程吧,说到事件分发,首先应该想到的是两个类,View和ViewGroup,ViewGroup是继承自View实现的,View

Android触摸事件机制

前言 随着科学技术的发展,智能手机早已成为我们当代人身边必不可少的"伙伴"之一,堪比对象女友.每天我们对着手机重复的做着点击.滑动操作,而手机则随着我们的操作给我们展示她的精彩. - 废话到此结束. 看到这里,即使不是作为移动端码农的你也应该知道触摸事件对手机(经典键盘机除外)的重要性了. 什么是触摸事件 顾名思义,就是触摸手机屏幕后产生的事件.这时候请你拿出手机,点击屏幕中的某个按钮(不要松手),移动一段距离,松手. 这个过程一般会产生如下几个事件: 点击(Down)事件 移动(Mo

ViewGroup源码解读

我们之前刚刚分析完事件传递机制和view的源码,如果没有看过的,建议看完View的事件拦截机制浅析以及View的事件源码解析.这次我们来分析下viewgroup的. 可能有人会想,怎么又是源码分析,肯定又是一大通.其实没你想的那么复杂.仔细分析一波就行了. 解读ViewGroup 我们都知道,一个事件完整的流程是从dispatchTouchevent–>onInterceptTouchevent–>onTouchEvent.我们先不说事件监听的问题.上述三个步骤就是正常一个点击的流程.前面我们

Android触摸屏事件派发机制详解与源码分析二(ViewGroup篇)

1 背景 还记得前一篇<Android触摸屏事件派发机制详解与源码分析一(View篇)>中关于透过源码继续进阶实例验证模块中存在的点击Button却触发了LinearLayout的事件疑惑吗?当时说了,在那一篇咱们只讨论View的触摸事件派发机制,这个疑惑留在了这一篇解释,也就是ViewGroup的事件派发机制. PS:阅读本篇前建议先查看前一篇<Android触摸屏事件派发机制详解与源码分析一(View篇)>,这一篇承接上一篇. 关于View与ViewGroup的区别在前一篇的A

自定义 ViewGroup 支持无限循环翻页之三(响应回调事件)

大家如果喜欢我的博客,请关注一下我的微博,请点击这里(http://weibo.com/kifile),谢谢 转载请标明出处,再次感谢 ####################################################################### 自定义 ViewGroup 支持无限循环翻页系列 自定义 ViewGroup 支持无限循环翻页之一(重写 onLayout以及 dispatchDraw) 自定义 ViewGroup 支持无限循环翻页之二(处理触摸事件)

android 自定义控件之ViewGroup生命周期执行步骤

前言 了解ViewGroup的生命周期的执行步骤对于自己自定义ViewGroup的时候十分重要,清楚了整个流程才能对ViewGroup有更深的理解.本文从个人的总结,来阐述一下执行的顺序.执行说明 首先ViewGroup的常用的生命周期主要有:构造方法.onLayout().onFinishInflate().onMeasure().onSizeChanged(),前两种在创建ViewGroup子类的时候,必须重写.至于draw()和drawChild()是其用来绘制背景和子View用的,就不在

[Android] 自定义ViewGroup最佳入门实践

对自定义view还不是很了解的码友可以先看自定义View入门这篇文章,本文主要对自定义ViewGroup的过程的梳理,废话不多说. 1.View 绘制流程 ViewGroup也是继承于View,下面看看绘制过程中依次会调用哪些函数. 说明: measure()和onMeasure() 在View.Java源码中: public final void measure(int widthMeasureSpec,int heightMeasureSpec){ ... onMeasure ... } p