WindowManager.LayoutParams
这个类其实是继承于ViweGroup的静态类LayoutParams ,从名字上看的出来,他是布局参数的类。
现在对这个类有几个问题:
看主要功能还是从源码角度来观察
@Deprecated
public static final int FILL_PARENT = -1;
public static final int MATCH_PARENT = -1;
public static final int WRAP_CONTENT = -2;
从@Deprocated看出 大家说的不提倡FillParent 是对的,这个参数已经被废除了,并且在代码中可以看出Fill_parent 和Match_parent 的意思是一样一样的。所以现在都推荐使用MatchParent
这三个参数都是在写界面的时候经常用到的三个控制大小的参数 ,说明一个View 的layoutParams 是不是真的就是这个类呢?继续往下看:
@ExportedProperty(
category = "layout",
mapping = {@IntToString(
from = -1,
to = "MATCH_PARENT"
), @IntToString(
from = -2,
to = "WRAP_CONTENT"
)}
public int height;
这有几个标签:分别是@ExportedProperty 输出性能 具体的使用在这篇博客有介绍:https://blog.csdn.net/xingchenxuanfeng/article/details/54629406
我们这里只要知道这段代码的意思是说:height 这个属性属于layout 这个类,在Hierarchy Viewer的layout 下啦选择中可以看到,总所周知大家在写height的时候写的FILL_PARENT 或者WRAP_CONTENT其实对应的是-1 或者-2 ,但是在Hierarchy viewer 如果不要直接显示-1 -2的话就使用mapping ,表示吧-1 转化为Match_Parent 这个字符串。
之后呢? 没有了?
其实不是的,每个定义的ViewGruop 都会定义自己的layoutParams , 比如说最常用的LinearLayout 就有定义自己的LayoutParams ,继承与ViewGroup.MarginLayoutParams
具体的使用逻辑就是这样的:我们知道Android 中view 根据类型分为:ViewGroup 和View 。当然ViewGroup 本身也是个view。 然后我们在xml代码中定义写的标签例如如下代码:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/activity_horizontal_margin"
android:layout_below="@id/tts_tv" >
<Button
android:id="@+id/play_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/play_button_name" />
<Button
android:id="@+id/stop_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="停止" />
LinearLayout>
一个view的属性分为两种,一种是自身生效的属性 :例如:Android:text =”asd” 这种就是对view直接生效的属性。一种是对父view 生效的属性:例如:Android:height 什么的,父view(viewgroup)根据 view的这些属性对view的放置位置等信息进行排版。
所以layoutparams 的主要功能就是可以更具不同的viewgruop进行扩展,从而适应不同的viewGruop 的排版规则。
使用方法如下:
//获取一个viewgroup 也可以自己创建
LinearLayout layout = findViewById(R.id.rootview);
//创建一个view 并对他自己的属性进行赋值
TextView textView = new TextView(this);
textView.setText("代码添加的view");
textView.setBackgroundColor(Color.parseColor("#ff0000"));
textView.setGravity(Gravity.CENTER);
//生成一份对应viewGruop的layoutParams ,这里有两种方式:第一种如下自己在new的时候定义
LinearLayout.LayoutParams textParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT);
//view 赋予值layotParames,这段代码也可以不写,因为layoutParagems 的数据是给viewgroup 看的,所以只需要在laout.add(view ,viewLayoutParams)这样就可以了。
textView.setLayoutParams(textParams);
//在layout.addView 的源码看出,textview 的layoutParames 会被提取出来执行 addView(child, index, params) 这个方法,而layout.add(view, params )的代码是一样的
layout.addView(textView);
//第二种生成params的方法:前提是view要有父view
LinearLayout.LayoutParams textParams = new LinearLayout.LayoutParams(view.getLayoutParams());
从上面的代码中看的出来:这个layoutParams 是每个view都具有的属性,很简单因为每个view都需要对父view报告自己的位子除了根view。
做个笔记:一个view的测量过程
例如上面的那个xml文件:
LinearLayout 绘制的时候会先去测量大小,但是他是个viewgruop 所以他会以递归的方式进行子view的大小的测量在这里就是两个button的测量,从两个button中获取到layoutParams 然后根据这个layoutParams 的值对子view进行测量从而决定大小。