Android LayoutParams 源码分析

WindowManager.LayoutParams


这个类其实是继承于ViweGroup的静态类LayoutParams ,从名字上看的出来,他是布局参数的类。
现在对这个类有几个问题:

  • 这个类主要功能是什么?
  • 既然是布局参数的类还是在ViewGroup 中 ,那么这个类是每一个view 都具有的还是ViewGroup 独有的属性。

主要功能

看主要功能还是从源码角度来观察

    @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());

既然是布局参数的类还是在ViewGroup 中 ,那么这个类是每一个view 都具有的还是ViewGroup 独有的属性

从上面的代码中看的出来:这个layoutParams 是每个view都具有的属性,很简单因为每个view都需要对父view报告自己的位子除了根view。

做个笔记:一个view的测量过程

例如上面的那个xml文件:
LinearLayout 绘制的时候会先去测量大小,但是他是个viewgruop 所以他会以递归的方式进行子view的大小的测量在这里就是两个button的测量,从两个button中获取到layoutParams 然后根据这个layoutParams 的值对子view进行测量从而决定大小。

你可能感兴趣的:(我的Android开,android-进阶)