android View 的绘制流程

182 阅读1分钟

一.布局的加载

activity如何加载布局 setContentView(xml);

setContentView();

1️⃣调用activity的setContentView();

2️⃣调用 Window 里面的setContentView();

3️⃣phoneWindow是Window(抽象类)的唯一实现类

4️⃣最终调用PhoneWindow类里面的setContentView();

5️⃣调用installDecor();初始化DecorView 向DecorView中添加系统布局 获取其中的帧布局

6️⃣创建出DecorView

7️⃣ generatelayout传入创建出来的DecorView

布局资源

最后返回的是content帧布局 所有的xml布局都是放在这个FramLayout里面

二.绘制流程

在PhoneWindow的setContentView方法中调用了ViewGroup的addView()

看invalidate(true);

ViewGroup里面的do...while循环一直找到DecorView

调用ViewRootImpl中的invalidateChildInParent();

调用 invalidate();

调用scheduleTraversals

调用doTraversals();

调用performTraversals(); View绘制的核心方法

performTraversals()做了三件事情

  1. performMeasure(childWidthMeasureSpec, childHeightMeasureSpec);测量

调用view的 measure()

2.performLayout(lp, desiredWindowWidth, desiredWindowHeight);布局

调用view的 layout();

3.performDraw();绘制

最终调用View的draw();