讲解
我们知道,我们可以通过LayoutParams设置宽度和高度,为什么没有setHeight() 和setWidth()?
因为控件的高度和宽度控制影响的不止是控件本身,对应的父容器也需要改变。而且我们某些情况也需要设置控件的宽高为wrap_content或者match_parent 。
所以我们需要一个规范,这个规范可以是接口,可以是类。
这个时候父容器可以给子控件一个LayoutParams,子控件去改变LayoutParams的值从而改变自己的属性,这个时候父控件也可以调用方法获取子空间的相应的属性,不然如果任由子控件进行属性设置,假如子空间实现的是getWidth2() 而不是getWidth() 那不是父控件获取不到了?😄
其实还有一个作用,就是告诉父控件我子控件的约束是什么,因为比如RelativeLayout具有一些特殊的属性,比如layout_centerInParent,这个时候我们子控件就可以通过
indicateLayoutParams.addRule(RelativeLayout.CENTER_IN_PARENT);
来建立父控件和子控件的联系。
LayoutParams产生
它的产生过程,需要研究ViewGroup.addView的源码
对调用addView(View view)这个方法时,
1.判断View.getLayoutParams()是否为空
2.如果是空,通过父控件的generateLayoutParams()来赋给子控件LayoutParams
3.如果不为空,就直接使用子控件的LayoutParams。
还有一个addView(View view , LayoutParams params)
这个时候就是手动给值了。
tip: 子控件的构造方法不会创建LayoutParams
网友评论