View 树的绘图流程 当 Activity 接收到焦点的时候,它会被请求绘制布局,该请求由 Android framework 处理.绘制是从根节点开始,对布局树进行 measure 和 draw。...View 绘制流程函数调用链 ?...绘制流程相关概念及核心方法 先来看下与 draw 过程相关的函数: View.draw(Canvas canvas): 由于 ViewGroup 并没有复写此方法,因此,所有的视图最终都是调用 View...View.onDraw(): View 的onDraw(Canvas)默认是空实现,自定义绘制过程需要复写的方法,绘制自身的内容。 dispatchDraw() 发起对子视图的绘制。...绘制流程图 ?
do { View view = null; if (parent instanceof View) {...(view !...performDraw(); //..... } 可以看到,进入这里面了,会依次调用performMeasure performLayout performDraw三个函数,依次调用了view的绘制流程...performDraw负责绘制,performDraw()会 调用draw,在调用drawSoftware /** * @return true if drawing was successful...流程为下图: ? 从这更加验证了我们嵌套多层之后会消耗性能的真理。 invalidate()就分析到这里了,有什么意见或者文中有什么错误的希望可以在下方评论。希望大家可以在看我的文章中可以学习到知识。
概述 View的绘制流程主要是指测量、布局以及绘制显示,在View中,measure是测量View的宽高,layout是控制View四个顶点的位置,而draw就是将布局直接绘制出来。...Measure流程 measure的流程氛围View的measure流程以及ViewGroup的measure的流程。...Draw流程 对于绘制,相对前2个就很简单了,因为前面我们已经可以正确的拿到了布局的宽高以及布局的位置,现在我们需要通过draw方法将其绘制出来。...那我们看看其他的,第一步:绘制背景,第三步:绘制内容,第四步:绘制子view。第六步:绘制装饰,例如,前景,滚动条等等。...方法;若两者均发生改变,则需调用两者,按照View的绘制流程,推荐先调用requestLayout方法再调用invalidate方法。
,所以说这些View应该都具有相同的绘制流程与机制才能显示到屏幕上(因为他们都具备相同的父类View,可能每个控件的具体绘制逻辑有差异,但是主流程都是一样的)。...既然一个View的绘制主要流程是这三步,那一定有一个开始地方呀,就像一个类从main函数执行一样呀。对于View的绘制开始调运地方这里先给出结论,本文后面会反过来分析原因的,先往下看就行。...其中的mView就是View对象。如下就是整个流程的大致流程图: ? 如下我们就依据View绘制的这三个主要流程进行详细剖析(基于Android5.1.1 API 22源码进行分析)。...2 View绘制流程第一步:递归measure源码分析 整个View树的源码measure流程图如下: ?...7 View绘制流程总结 至此整个关于Android应用程序开发中的View绘制机制及相关重要方法都已经分析完毕。
或者梳理的不多,当我梳理到view的时候,发现需要分成绘制流程以及事件分发进行处理。一开始是想整理一般面试的概要。后来想想,还是看源码慢慢整理把。...当我把整个绘制流程的源码看完之后,我突然对一个词比较陌生,就是MeasureSpec。然后就决定整理一波。...MeasureSpec概念 通过源码我们可以知道MeasureSpec是View的内部类,用来控制view的尺寸。也就是view的宽高是由他决定的。...UNSPECIFIED); } size += delta; if (size < 0) { Log.e(VIEW_LOG_TAG...我在文章开头说了,这只是绘制流程中的一个小东西而已。如果不结合整个绘制流程,单独看这个肯定一脸蒙蔽,那么后续的绘制流程教程什么时候出?可能要过段时间了。
具体分析 以下源码基于版本27 DecorView 的draw 流程 在《View的绘制-measure流程详解》中说过,View 的绘制流程是从 ViewRootViewImpl 中的 performMeasure...= null) { mMenuBackground.draw(canvas); } } View 的 draw 流程 就这样, View 的绘制就开始啦。...foreground.draw(canvas); } } 以上就是 View 的绘制流程了。...ViewGroup 本身是继承 View 的,它的基本绘制流程也是通过父类 View 进行的,只不过它重写了 dispatchDraw 方法,来进行子元素的绘制。...,如果子元素是继承了 ViewGroup ,就再次循环调用 dispatchDraw 方法,一层层往下递归调用,直到每一个子元素都被绘制完成,整个 draw 流程也就结束了。
View绘制的流程框架 如图所示 ? View的绘制是从上往下一层层迭代下来的。...DecorView-->ViewGroup(--->ViewGroup)-->View ,按照这个流程从上往下,依次measure(测量),layout(布局),draw(绘制)。 ?...canvas) draw过程则决定了View的显示,完成draw后view会显示在屏幕上 绘制背景(background.draw(Canvas)) 绘制自己 protected void onDraw...(Canvas canvas) onDraw绘制自己,新建一个paint 在canvas上绘制自己的图形 绘制children (dispatchDraw)dispatchDraw会遍历调用所有子元素的...从View的测量、布局和绘制原理来看,要实现自定义View,根据自定义View的种类不同,可能分别要自定义实现不同的方法。
View绘制基本流程 这里先给出Android系统View的绘制流程:依次执行View类里面的如下三个方法: measure(int ,int) :测量View的大小 layout(int ,int...,int ,int) :设置子View的位置 draw(Canvas) :绘制View内容到Canvas画布上 ?...整个measure调用流程就是个树形的递归过程 measure()方法两个参数都是父View传递过来的,也就是代表了父view的规格。...,draw()方法实现的功能如下: 1、绘制该View的背景 2、为显示渐变框做一些准备操作 3、调用onDraw()方法绘制视图本身(每个View都需要重载该方法,ViewGroup不需要实现该方法)...4、setEnabled()方法:请求重新draw(),但不会重新绘制任何视图包括该调用者本身。 总结 以上就是本文关于Android中View绘制流程详细介绍的全部内容,希望对大家有所帮助。
layout视图位置确定 layout的流程主要也是遍历整个view树结构,调用view.layout(int l, int t, int r, int b)确定好view的具体坐标位置,流程图如下 ?...使用View的getWidth()和getHeight()方法来获取View测量的宽高,必须保证这两个方法在onLayout流程之后被调用才能返回有效值。...所以又回归到了ViewGroup与View的树状递归draw过程 先来看下View树的递归draw流程图,如下: ?...这里写图片描述 draw原理总结 可以看见,绘制过程就是把View对象绘制到屏幕上,整个draw过程需要注意如下细节: 如果该View是一个ViewGroup,则需要递归绘制其所包含的所有子View。...View默认不会绘制任何内容,真正的绘制都需要自己在子类中实现。 View的绘制是借助onDraw方法传入的Canvas类来进行的。
= null); } 调用第二个方法的时候第三个参数是与第二个参数ViewGroup是否为空有关的,这个参数具体作用我们后面代码流程分析再说。...代码流程 先看一张流程图: ?...try { View view; ... if (view == null) { ......} else {// 带有包名的View(例如自定义的View,或者引用的support包中的View) view = createView(name, null...", attrs); } 系统的视图都在android.view包下,所以要添加前缀“android.view.”
了解绘制的整体流程 绘制会从根视图ViewRoot的performTraversals()方法开始,从上到下遍历整个视图树,每个View控件负责绘制自己,而ViewGroup还需要负责通知自己的子View...//执行绘制流程 performDraw(); } preformLayout和performDraw的传递流程和performMeasure是类似的,唯一不同的是,performDraw的传递过程是在...View绘制流程之Measure Measure的基本流程 页面的测量流程是从performMeasure方法开始的,相关的核心代码流程如下。...) View的绘制流程之Layout Layout的基本流程 // ViewRootImpl.java private void performLayout(WindowManager.LayoutParams...的绘制流程之Draw private void performDraw() { ...
二,发送流程 HardWare到达Display之后,Display会将vsync信号分成两个一个用于生成一个用于消费的vsync信号。...也就是说我们可以打乱顺序是先合成消费帧数据绘制到屏幕上还是先生成帧数据。...(释放的操作在native层对应的处理是把这块内存区域变成一个Bitmap交由RenderThread去渲染) draw方法其实并没有进行真正的绘制,而是把绘制的内容放入到了DisplayList中接着同步到...绘制最终会调用到View.invalidate方法 2.RenderThread执行的时候UIThread就可以释放掉去做其他处理,接着RenerThread去取出DisplayList中的数据进行处理生成...具体流程: RenderThread会执行一个DrawFrameTask的Task,里面核心方法是DrawFrame。通过OpenGl和一些库将渲染数据通知给SurefaceFliger去做图层合成。
private void addInArray(View child, int index) { View[] children = mChildren; final int count...public void addView(@NonNull View view, @NonNull ViewGroup.LayoutParams params) { applyDefaultToken...view, WindowManager.LayoutParams attrs, View panelParentView, int userId) { mAdded...mProfile = false; } } } 到了我们熟悉的performTraversals方法,接下来就是 measure、layout、draw这三大流程就不详细讲...,这三个流程中会把childView数组中每个子view遍历放在DecorView中,呈现出屏幕上。
View绘制流程,必问,请不要只会回答onMeasure,onLayout,onDraw,更多完整面试专题,请关注公众号获取。...mLayoutRequested = true; scheduleTraversals(); } } 上面的方法中调用了scheduleTraversals()方法来调度一次完成的绘制流程...下面,我们以performTraversals()为起点,来分析View的整个绘制流程。...2、View的绘制流程 View的绘制,有三个步骤:测量(measure),布局(layout),绘制(draw), 从DecorView自上而下遍历整个View树,注意是所有View执行完一个步骤后,...六个步骤:①、绘制视图的背景;②、保存画布的图层(Layer);③、绘制View的内容;④、绘制View子视图,如果没有就不用;⑤、还原图层(Layer);⑥、绘制滚动条。
所以绘制流程是由最外层的View开始,一步一步向内传递执行。...而整个过程又是递归等待的,最外层的View需要等内层所有的View执行完绘制流程才结束,所以便有了”减少布局层级,可以有效提升App性能”这一经典总结。 正文 什么时候开始绘制?...View的绘制流程是什么时候开始的?谁触发的?明白这点后,才去考虑这个过程是怎样执行的。...(DecorView)添加上去,进而开始绘制流程。...到这儿我们算是明白View的绘制流程是从哪儿开始的,接下来分析这个过程到底是怎么做的。
配合Activity 从启动到布局绘制的简单分析 阅读 ? View的绘制.png 基本概念介绍 Activity:一个 Activity 是一个应用程序组件,提供一个屏幕,用户可以用来交互。...上面内容是在 onCreate() 中执行完成的 然后在 onResume 执行完成后调用View的绘制 详细的说明看:Activity 从启动到布局绘制的简单分析 View 的绘制 View 的绘制流程可以分成三步...:测量、布局、绘制 分别对应了:onMeasure() onLayout() onDraw 当然这个过程中也会调用许多其他的方法,都是作为辅助,大的流程就这三步。...绘制 onDraw onDraw() 函数就是来绘制了,一般 ViewGroup 不会实现内部的方法,子控件才重写 onDraw() 方法。也是内部一层层分发绘制。...然后 draw() 的内部的执行就和上面介绍 onDraw() 中一样了 到此整个页面的测量、布局、绘制就全部分析完毕了。 可以查看:Activity 从启动到布局绘制的简单分析
去绘制它自己,必须传入父view的测量spec与子view自己的padding值 protected void measureChild(View child, int parentWidthMeasureSpec...dirtyOpaque) onDraw(canvas); //绘制子view,如果当前没有子view则不需要绘制,在view中是空实现,具体在viewgroup中实现方法 // Step...= null) {/调用view的draw方法进行绘制子view more |= drawChild(canvas, transientChild, drawingTime...但是当viewgroup需要通过onDraw方法来绘制内容时,于是就要显示的关闭WILL_NOT_DRAW方法 Draw 分析总结 当是一个viewgroup,那么要递归所有的子view已完成绘制 从源码中可知...viewgroup不绘制任何内容,真正绘制在子view中进行,也就是调用子view的draw方法进行绘制 View动画和ViewGroup布局动画区别: View动画指的是View自身的动画,可以通过
在view中onDraw()是个空函数,也就是说具体的视图都要覆写该函数来实现自己的显示(比如TextView在这里实现了绘制文字的过程)。...而对于ViewGroup则不需要实现该函数,因为作为容器是“没有内容“的,其包含了多个子view,而子View已经实现了自己的绘制方法,因此只需要告诉子view绘制自己就可以了,也就是下面的dispatchDraw...),开始绘制渐变框; (6)绘制滚动条; 从上面可以看出自定义View需要最少覆写onMeasure()和onDraw()两个方法。...// //所有子视图都绘制完成后这里还可以做一些处理,比如绘制阴影什么的 // } 其他 从以上分析可以看出View树的绘制是一个递归的过程,从ViewGroup...一直向下遍历,直到所有的子view都完成绘制,那这一切的源头在什么地方(是谁最发起measure、layout和draw的)?
View的工作流程主要是指measure、layout、draw这三大流程,即测量、布局和绘制,其中measure确定View的测量宽高,layout根据测量的宽高确定View在其父View中的四个顶点的位置..., panelParentView); View的绘制流程是从ViewRoot的performTraversals方法开始的,它经过measure、layout和draw三个过程才能最终将一个View绘制出来...,大致流程如下图: ?...child.layout方法,对子View进行布局 draw绘制 Draw过程就比较简单了,它的作用是将View绘制到屏幕上面。...View的绘制过程遵循如下几部: 绘制背景background.draw(canvas); 绘制自己onDraw; 绘制children:dispatchDraw; 绘制装饰onDrawForeground
领取专属 10元无门槛券
手把手带您无忧上云