专栏名称: 俞其荣
向前跑 迎着冷眼和嘲笑 与 http://yuqirong.me 保持同步更新
目录
相关文章推荐
新疆949交通广播  ·  新疆移动助力志愿填报 书写金榜题名崭新篇章 ·  14 小时前  
新疆949交通广播  ·  注意!6月15日24时起暂停实施 ·  昨天  
Python大全  ·  16个必知必会的Python技能! ·  2 天前  
新疆949交通广播  ·  微信最新公告!下架! ·  2 天前  
新疆949交通广播  ·  免费!折扣!一大批景区福利来了→ ·  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 重新去调整自己。







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