您的位置:

深度剖析Android中的LayoutParams

一、layoutParams方法

在Android中,LayoutParams是一个重要的类,通常由ViewGroup的子类使用。LayoutParams是一个子类,它定义了子View在布局 文件中的尺寸、位置和边距等信息。一般而言,我们在使用Layout时,必须对特定的View创建一个LayoutParams实例,并将其附加到父布局中。

Layout中常见的LayoutParams分别如下:

LayoutParams
   |- LinearLayout.LayoutParams
   |- RelativeLayout.LayoutParams
   |- FrameLayout.LayoutParams
   |- ...

这些LayoutParams子类都拥有多个构造函数,以满足不同的需求,其具体使用方式可以查阅官网文档。

二、layoutParams类型2006

LayoutParams中的type属性可以指定八种类型之一,默认为0,type属性的不同值代表不同的布局效果。

LayoutParams.TYPE_SYSTEM_ALERT代表这是一个全局系统级弹窗的LayoutParams,只有在TYPE_TOAST之前才可以使用。它需要权限 android.permission.SYSTEM_ALERT_WINDOW,不然在调用layParams的时候会抛java.lang.SecurityException异常。

三、layoutParams参数

LayoutParams中的参数除了上述的type属性以外,还有其他常见的参数。

1、width和height代表View的宽和高,可以设为以下值:

    WRAP_CONTENT 长和宽为内容的大小, 即根据应用实际内容计算得出
    MATCH_PARENT 长和宽充满父控件
    固定值 长和宽为固定的数值

2、gravity表示子视图与父视图之间的在x、y轴上的对齐方式,如:center|center_vertical

3、weight属性是LinearLayout的重点,它指定了子视图所占用的空间比重,一般设为1,当调整布局时,子视图按照权重平分剩余空间。

四、layoutParams.flag

LayoutParam中的flag是一个位运算标记,可以设置LayoutParams的样式、行为和标志。该标志只能由LayoutParams的创建者使用,程序员不能直接设置。当然,使用父View里的addView()函数创建LayoutParams对象,也会自动创建一个默认的LayoutParam对象。

一些常见的标志有:

    FLAG_FORCE_LAYOUT       强制父视图调用requestLayout()函数
    FLAG_LAYOUT_IN_SCREEN   子控制在屏幕上占据空间的时候使子控制在屏幕上对齐父控件
    FLAG_LAYOUT_NO_LIMITS   子控制不会限制在视图容器之内的布局属性

五、layoutParams.type

在LayoutParams中,type即为layoutParams.type,可以指定当前LayoutParams的类型,在不同类型下会表现出不同的布局效果。

几个常见的布局类型有:

    ABSOLUTE       指定控件的绝对位置, 忽略左右高低的绘制规则
    FILL_PARENT   当前控件充满父控件
    MATCH_PARENT  当前控件内容和容器(父控件)内容一样大小
    WRAP_CONTENT  根据内容自适应控件大小

六、layoutParams flags

LayoutParams中的flags属性,用于定义LayoutParams的表现。flags属性是一个int类型的标志,可以组合使用,表示LayoutParams的效果。

常见的属性有:

    LAYOUT_FLAG_NO_BACKGROUND  不要绘制ViewGroup的背景
    LAYOUT_FLAG_CLIP_TO_PADDING  在ViewGroup中显示视窗内的内容而不是全部,通俗地说,就是在绘制背景时是否经过padding
    LAYOUT_FLAG_CLIP_CHILDREN   标记是否对子视图进行修剪和是否避免在子视图之外进行绘画

七、layoutParams overlay

LayoutParams中的overlay是一个布尔值,用于指定窗口的overlay属性。如果为true,则表示该view是在其他的视图之上进行渲染;否则,该视图在所有其他非覆盖视图后面进行渲染。

八、layoutParams match_parent

一般在父控件中间,我们会让一个子视图填满父控件,这时我们就需要使用match_parent属性。该属性需要在子视图LayoutParam的width或height使用,如果都使用会覆盖宽和高的尺寸,比如:

  

    
   

    
   


  

九、layoutParams设置margin单位

LayoutParam中的margin是为了让视图之间产生间隔,由于视图之间的间隔有时需要按像素值控制,因此需要LayoutParam支持按像素值设置margin。

在LayoutParam继承类(如FrameLayout.LayoutParams)中,同时支持按比例设置margin和按像素数值设置margin。

    LayoutParams lp = new FrameLayout.LayoutParams(
            ViewGroup.LayoutParams.WRAP_CONTENT,
            ViewGroup.LayoutParams.WRAP_CONTENT);

    int margin = 20;//20px
    lp.setMargins(margin, margin, margin, margin);
    view.setLayoutParams(lp);

十、LayoutParams type=2002、2003

LayoutParams中的Type分为八种,这其中有两种是能被我们使用的,分别为Type 2002和Type 2003。他们分别是MATCH_CONSTRAINT和MATCH_CONSTRAINT_SPREAD,是约束布局中使用的,是ConstraintLayout的布局。

Type 2002 即为MATCH_CONSTRAINT,与Match、Fixed、Wrap三个属性类似,同时又不同于他们。Type 2003,即MATCH_CONSTRAINT_SPREAD,与Type 2002类似,但是同时地,它又能够扩展,即在一定程度上,该属性能够与其他控件进行融合。

基本的使用方式会根据不同的控件,有些细节会略有不同,如果需要请引用官方文档进行更详细地学习。

十一、结语

本文对Android中LayoutParams进行了详细的剖析,包括类型、参数、flag、overlay、match_parent,margin单位、以及MATCH_CONSTRAINT和MATCH_CONSTRAINT_SPREAD。LayoutParams是布局的基础知识之一,在掌握LayoutParams后,能够让我们更加灵活地应对开发过程中的布局问题。