LinearLayout源码解析
1.LinearLayout中最重要的部分:orientation Measure weight
2.orientation:分为Horizontal vertical 两种方向的原理是类似的,所以这里只分析vertical垂直方向
measure
1.定义一些列的参数
2.循环LinearLayout中的子view,并且测量他们的高度,当子view设置了weight属性,就给个标记,并且跳过该view的高度的测量
3.对于设置了weight属性的view进行测量,此时分两种情况,子控件的高度是否为0,父控件的测量模式是否为Exactly
weight
1.测量的结果是由父控件的测量模式和子控件的LayoutParams共同决定的
2.当父view的测量模式为Exactly时,如果,子view设置了weight,并且height==0,此时,测量的结果和我们分配的weight是一致的;
3.当父View的测量模式为Exactly时,如果,子view设置了weight,并且height设置为match_parent或者具体的数值时,测量的结果跟我们分配的weight是相反的;
4.当父View的测量模式为At_Most时,如果子View设置了weight,那么子View的高度会被强行设置为wrap_content,然后按照wrap_content模式进行测量
5.当父view的测量模式为At_Most时,如果子View没有设置weight,那么子View的高度跟其他viewGroup一致
参数解释
1.父类的测量模式:
EXACTLY——一般是设置了具体的值或者match_parent
当前尺寸就是当前View应该取的尺寸
AT_MOST—-wrap_content
当前尺寸是当前View能取的最大尺寸
UNSPECIFIED(不常用)
父容器没有对当前View有任何限制,当前View可以任意取尺寸
2.子类的布局参数:LayoutParams(layoutParams.weight)