講解
我們知道,我們可以通過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