View 自定义 - 概览

一、体系

详见:Activity、Window、DecorView、ViewRoot 之间的关系

View 自定义 - 概览_第1张图片二、绘制前的准备 DecorView

详见:DecorView

顶部图中可以看出 ViewRoot 最后一步是绘制,在绘制之前系统会有一些准备,即前面几个步骤:创建PhoneWindow、DecorView、ViewRootmpl。

三、基础知识

3.1 继承 View、ViewGroup

详见:继承 View、ViewGroup

3.2 坐标系

详见:坐标系、位置获取

3.3 颜色

四、绘制流程

View 自定义 - 概览_第2张图片

从 DecorView 中可以看出 View 的绘制流程开始于ViewRootImpl 对象的 performTraversals(),从视图树根节点(即 DecorView 它是个 ViewGroup)开始由上向下遍历测绘(DecorView→中间层ViewGroup→最底层View)。 

View 自定义 - 概览_第3张图片

构造函数只执行一次,而 onMeasure()、onLayout()、onDraw() 可能会执行很多次,因此对于全局变量的初始化,需要在生命周期方法中都调用一次来重置,避免每次执行都拿到用过的数据。

View 自定义 - 概览_第4张图片

自定义 View 主要是实现 onMeasure() + onDraw(),因为没有子元素需要布局。自定义 ViewGroup 主要是实现 onMeasure() + onLayout(),因为子元素都绘制好了父容器不需要额外绘制。 

Measure 过程 测量控件的宽高 performMeasure() → measure() → onMeasure() → 子控件的 Measure 过程。
Layout 过程

确定控件最终宽高在父容器中的位置

(即四个顶点位置)

performLayout() → layout() → onLayout() → 子控件的 Layout 过程。
Draw 过程 将控件绘制在屏幕上 performDraw() → draw() → onDraw() → 子控件的 Draw 过程。

4.1 Measure 过程

4.2 Layout 过程

4.3 Draw 过程

你可能感兴趣的:(View,android)