requestLayout( )

该函数的执行过程比较简单,因为当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版权协议,转载请附上原文出处链接和本声明。