Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说
linearlayoutmanager_creo接触分析实例,希望能够帮助你!!!。
昨天做一个LinearLayout布局的时候,遇到一个想象,当给LinearLayout设置android:background属性的时候,LinearLayout的高度就出现意想不到的效果。
一、导火索
先看我昨天的测试布局文件:
针对两个LinearLayout的高度,我同意设置为wrap_content,但是给LinearLayout都设置了背景。最后打印出来的高度:
D/Test: parent:239 child:170 button:88
一时间没搞懂这个问题,所以决心Look下LinearLayout的源码看看。
LinearLayout是我们Android中最常见的布局,里面有的属性确实知悉的比较少,这次也算探究一下。
源码Android-25
二、LinearLayout测量过程分析
onMeasure方法
在onMeasure方法中,根据LinearLayout的方向调用不同的measure方法进行测量。
measureVertical()
在measureVertical方法中,总体来说分为两部分,一部分是针对子view的基础属性测量,另一部分是对weight部分进行计算。
第一次测量过程
在这次的测量中,这部分代码的核心就是围绕着mTotalLenght的计算而展开的,代表着计算出的LinearLayout的总长度。这部分高度值包含:子View的高度、子View对应的上下margin之和、divider的高度。
在上面的测量过程中,我们可以发现,针对View.GONE属性的View,无需对它的高度进行测量,可以直接跳过,这也是我们设置View.GONE可以隐藏控件占据空间的原因,也体现与View.INVISIBLE的区别。在这里,我们需要注意一下对lp.height0&&lp.weight0属性的View的处理,这部分处理分为两部分,一部分是LinearLayout的高度为EXACTLY的时候,通过将mTotalLenght与totalLength + lp.topMargin + lp.bottomMargin比较,取大值。
第二次测量
在第二次测量过程中,判断系统是否使用了largestChild属性,并且此时的LinearLayout高度是不定的,然后开始重新测量mTotalLenght的长度。
第三次测量
在第三次测量的过程中,对那些跳过前面测量的控件进行测量,即对那些设置了weight属性的控件进行测量,这部分也是LinearLayout测量过程中重要的组成部分,从上面的分析来看,在进行weight的测量过程中,首先计算出LinearLayout还剩余的分配控件,接着判断当前View是否是前面跳过测量的view,如果是则进行子View的遍历,获取子view的LayoutParams属性中的weight值,用来计算该子View所分配的空间。接着测量view的高度,同时进行高度的设置。
通过对LinearLayout的onMeasure方法的通篇解读,我们可以得到以下结论:
LinearLayout的高度计算是有针对性的
在测量1的工程中,我们可以发现当满足一定条件时,子view的高度就不会被计算。
当View的visiable属性设置为View.GONE时,此时在LinearLayout的高度测量中就会忽略这个view。
今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
上一篇
已是最后文章
下一篇
已是最新文章