一.布局的加载
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()做了三件事情
- performMeasure(childWidthMeasureSpec, childHeightMeasureSpec);测量
调用view的 measure()
2.performLayout(lp, desiredWindowWidth, desiredWindowHeight);布局
调用view的 layout();3.performDraw();绘制
最终调用View的draw();