专栏名称: 俞其荣
向前跑 迎着冷眼和嘲笑 与 http://yuqirong.me 保持同步更新
目录
相关文章推荐
成都日报  ·  微周刊|“芒”有所获 ... ·  2 天前  
51好读  ›  专栏  ›  俞其荣

Window源码解析(三):Window的更新机制

俞其荣  · 简书  ·  · 2017-10-28 14:31

正文

请到「今天看啥」查看全文


之后就是调用 ViewRootImpl.setLayoutParams 来设置新的 params 。

ViewRootImpl

setLayoutParams(WindowManager.LayoutParams attrs, boolean newView)

    void setLayoutParams(WindowManager.LayoutParams attrs, boolean newView) {
        synchronized (this) {

            ...

            applyKeepScreenOnFlag(mWindowAttributes);

            // 传入的 newView 是 false ,不执行这些代码
            if (newView) {
                mSoftInputMode = attrs.softInputMode;
                requestLayout();
            }

            // Don't lose the mode we last auto-computed.
            if ((attrs.softInputMode & WindowManager.LayoutParams.SOFT_INPUT_MASK_ADJUST)
                    == WindowManager.LayoutParams.SOFT_INPUT_ADJUST_UNSPECIFIED) {
                mWindowAttributes.softInputMode = (mWindowAttributes.softInputMode
                        & ~WindowManager.LayoutParams.SOFT_INPUT_MASK_ADJUST)
                        | (oldSoftInputMode & WindowManager.LayoutParams.SOFT_INPUT_MASK_ADJUST);
            }

            mWindowAttributesChanged = true;
            // 使 view 重走三大流程
            scheduleTraversals();
        }
    }

setLayoutParams 中,调用了 scheduleTraversals() 方法。

在之前讲 View 工作原理的时候,我们都看过 scheduleTraversals() 最后会调用 performTraversals() 来开始 View 的测量、布局和绘制。所以在这,也就触发了 View 重新去调整自己。







请到「今天看啥」查看全文