从我遇到的两个问题说起:
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何时赋值就知道 了。
网友评论