Android开发(15)——深入源码了解视图创建流程
2021-03-30 本文已影响0人
让时间走12138
本节内容
1.View、ViewGroup和ViewRootImpl简介
2.View和ViewGroup的关系
3.performTraversals测量尺寸
4.布局和绘制
一、View、ViewGroup和ViewRootImpl简介
1.自定义View
(1)为什么需要自定义View:系统的View满足不了我们实际的需求。
2.View:单个视图,最小单元。一个View占据了屏幕的一块矩形区域,它负责绘制和事件处理。
3.ViewGroup:容器,可以承载单个或多个子视图。一个ViewGroup是一个特殊的View,它可以容纳其他的View(称为children)。它是布局(layouts)和视图容器(view containers)的base class,也就是说前面两个要继承ViewGroup。它还定义了一个LayoutParams类,它是为布局参数服务的。(任何一个容器都有自己的布局参数。)
4.ViewRootImpl:View的一个实现。它是视图层级里面的最顶层,实现了视图(View)和窗口管理器(windowManager)之间的协议,大多情况都是一个内部实现,不用去管。
image.png二、View和ViewGroup的关系
1.ViewGroup里面可以包含多个ViewGroup和View,但是View是最小单元,不能再包裹其他控件了。
视图创建流程图.png三、performTraversals测量尺寸
1.PerformMeasure:测量自己的宽和高,在这个方法里面会调用view.measure,本质上还是调用view的onMeasure方法。
2.如果是单个view,只需要测量一下自己有多大即可。
3.如果是ViewGroup,里面又有子视图(view),它调用performMeasure方法,容器的宽高由子视图来决定。这个时候要先知道子视图的尺寸,才能确定容器的尺寸。
四、布局和绘制
1.测量完ViewGroup的宽高之后,调用performLayout方法,也就是调用view对应的onLayout方法,重写这个方法,确定容器的位置。
2.canvas:一个用于绘制的类,可以理解为画板。
3:draw:系统自带的绘制的方法,它有很多绘制的步骤,必须按照正常的合适的顺序来执行。
1.绘制背景,setBackgroundColor
2.画具体的内容 onDraw(),重写这个方法。
3.画子视图(如果总体是一个容器的话,才有这个步骤)调用dispatchDraw()方法
4.画一点装饰性的东西,通过onDrawForeground()方法来实现。
4.Paint:画笔。
5.Path:形状。