linearlayoutmanager_creo接触分析实例

(1) 2024-09-06 20:23

Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说
linearlayoutmanager_creo接触分析实例,希望能够帮助你!!!。

昨天做一个LinearLayout布局的时候,遇到一个想象,当给LinearLayout设置android:background属性的时候,LinearLayout的高度就出现意想不到的效果。

一、导火索

先看我昨天的测试布局文件:

linearlayoutmanager_creo接触分析实例_https://bianchenghao6.com/blog__第1张

针对两个LinearLayout的高度,我同意设置为wrap_content,但是给LinearLayout都设置了背景。最后打印出来的高度:

D/Test: parent:239 child:170 button:88

一时间没搞懂这个问题,所以决心Look下LinearLayout的源码看看。

LinearLayout是我们Android中最常见的布局,里面有的属性确实知悉的比较少,这次也算探究一下。

源码Android-25

二、LinearLayout测量过程分析

onMeasure方法

linearlayoutmanager_creo接触分析实例_https://bianchenghao6.com/blog__第2张

onMeasure方法中,根据LinearLayout的方向调用不同的measure方法进行测量。

measureVertical()

linearlayoutmanager_creo接触分析实例_https://bianchenghao6.com/blog__第3张

在measureVertical方法中,总体来说分为两部分,一部分是针对子view的基础属性测量,另一部分是对weight部分进行计算。

第一次测量过程

linearlayoutmanager_creo接触分析实例_https://bianchenghao6.com/blog__第4张

在这次的测量中,这部分代码的核心就是围绕着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比较,取大值。

第二次测量

linearlayoutmanager_creo接触分析实例_https://bianchenghao6.com/blog__第5张

在第二次测量过程中,判断系统是否使用了largestChild属性,并且此时的LinearLayout高度是不定的,然后开始重新测量mTotalLenght的长度。

第三次测量

linearlayoutmanager_creo接触分析实例_https://bianchenghao6.com/blog__第6张

在第三次测量的过程中,对那些跳过前面测量的控件进行测量,即对那些设置了weight属性的控件进行测量,这部分也是LinearLayout测量过程中重要的组成部分,从上面的分析来看,在进行weight的测量过程中,首先计算出LinearLayout还剩余的分配控件,接着判断当前View是否是前面跳过测量的view,如果是则进行子View的遍历,获取子view的LayoutParams属性中的weight值,用来计算该子View所分配的空间。接着测量view的高度,同时进行高度的设置。

通过对LinearLayout的onMeasure方法的通篇解读,我们可以得到以下结论:

LinearLayout的高度计算是有针对性的

在测量1的工程中,我们可以发现当满足一定条件时,子view的高度就不会被计算。

  • 当View的visiable属性设置为View.GONE时,此时在LinearLayout的高度测量中就会忽略这个view。

今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

上一篇

已是最后文章

下一篇

已是最新文章

发表回复