该函数的执行过程比较简单,因为当View树进行重新布局时,总是重新给所有的视图进行布局,
因为,最简单的想法就是只要设置一个标识就好了。
* 首先给mPrivateFlags添 加 FORCE_LAYOUT标识,然后调用mParent的 requestLayoutO函数。对于
* 一个具体的View对象而言,其父视图要么是一个ViewGroup实例,要么是一个ViewRoot实例,而前
* 者并没有对该函数重载。也就是说,ViewGroup会按照基类 View )中的该函数进行处理,如果有多层
* 视图嵌套,这就会产生一个递归调用,并最终调用到ViewRoot类 的 requestLayoutO函数。
*/
public void requestLayout() {
if (ViewDebug.TRACE_HIERARCHY) {
ViewDebug.trace(this, ViewDebug.HierarchyTraceType.REQUEST_LAYOUT);
}
mPrivateFlags |= FORCE_LAYOUT;
if (mParent != null && !mParent.isLayoutRequested()) {
mParent.requestLayout();
}
}
ViewRoot.java
/**
* {@inheritDoc}
* 1 )调 用checkThreadO确保本次调用是在U I线程中执行的,非 U I线程执行该函数将导致状态管理
* 的混乱,并最终crash掉s
* 2) 给 ViewRoot中的变量mLayoutRequested赋值为true,之后真正进行布局的代码将检查读藥量,决定是否需要重新布局。
*
* 3)调 用 scheduleTraversals()发起一个View树遍历的消息,该消, 是异步处理的,对应的处理函数 performTraversals(
*/
public void requestLayout() {
checkThread();
mLayoutRequested = true;
scheduleTraversals();
}
```
版权声明:本文为CTO_1649900265原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。