美文网首页
记一次LinearLayout的onMeasure的踩坑记录

记一次LinearLayout的onMeasure的踩坑记录

作者: 苏鑫最胖的一组 | 来源:发表于2020-03-24 18:13 被阅读0次

    从我遇到的两个问题说起:

    1.LinearLayout的子View,FrameLayout的onMeasure方法走了四次,同样式其子View的Textview的onMeasure

    我们都知道,测量开始就是从,view树根也就是ViewRootImpl的performTraversals()方法开始的,那么总共来回会执行两次他的performMeasure方法,具体代码不分析了,performMeasure会调用mview(DecorView)的measure方法,即执行DecorView的父类,FrameLayout的measure方法,然后测量就开始了。大体流程如此,先上一下遇到问题的代码

    方便大家理解布局层级我在画一个示意图:

    出问题的就是包含txtview根Framlayout的LinearLayout,

    首先解释为什么会出现四次onMeasure,

    onMeasure的这一行出现了问题。他的matchWidth为true了 ,forceUniformWidth方法又走了一遍measureChildWithMargins,再次测量了他的子View,matchWidth为true的条件是:

    widMode 是MeasureSpec.AT_MOST,lp是子View的lp,那么首先textview不满足条件,满足条件的是FrameLayout,所有这里为true多走了一遍onMeasure。

    第二个问题是为什么第一遍是正确的大小,第二遍大小就不对了,元凶在这:

    逻辑跟上面的相同,就不再分析了,感兴趣的自己走一下allFillparent啥时候为false以及,alternativeMaxWidth何时赋值就知道 了。

    相关文章

      网友评论

          本文标题:记一次LinearLayout的onMeasure的踩坑记录

          本文链接:https://www.haomeiwen.com/subject/ankayhtx.html