Android-LayoutParams知多少

449 阅读4分钟

LayoutParams是什么

LayoutParams继承于Android.View.ViewGroup.LayoutParams

LayoutParams表示包含了layout宽高,位置,类型等信息,通过设置这些信息,生成不同的view。

LayoutParams类也只是简单的描述了宽高,宽和高都可以设置成三种值

  1. 一个确定的值
  2. FILL_PARENT,即填满(和父容器一样大小)
  3. WRAP_CONTENT,即包裹住组件就好。

构造函数

public LayoutParams() {
    super(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
    type = TYPE_APPLICATION;
    format = PixelFormat.OPAQUE;
}

public LayoutParams(int _type) {
    super(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
    type = _type;
    format = PixelFormat.OPAQUE;
}

public LayoutParams(int _type, int _flags) {
    super(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
    type = _type;
    flags = _flags;
    format = PixelFormat.OPAQUE;
}

public LayoutParams(int _type, int _flags, int _format) {
    super(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
    type = _type;
    flags = _flags;
    format = _format;
}

public LayoutParams(int w, int h, int _type, int _flags, int _format) {
    super(w, h);
    type = _type;
    flags = _flags;
    format = _format;
}

public LayoutParams(int w, int h, int xpos, int ypos, int _type,
        int _flags, int _format) {
    super(w, h);
    x = xpos;
    y = ypos;
    type = _type;
    flags = _flags;
    format = _format;
}

构造函数参数介绍

_type 代表的是不同类型的window。

window分为三种类型:

  • Application windows(应用程序window)

    层级范围为1-99,是属于正常的顶级应用程序window,例如我们所见到的Activity。

  • Sub-windows(子window)

    层级范围为1000-1999,例如部分Dialog。

  • System windows (系统window)

    层级范围为2000-2999,是属于最高层级,例如StatusBar,NavigationBar,覆盖在所有window之上。

_flags 表示window的属性

几种常见的Flag

  • 默认状态不设置Flag 在默认不设置Flag的状态下,在新window层级下的window将接受不到任何touch事件,即使是在新window的范围外。

  • FLAG_NOT_FOCUSABLE 表示此窗口范围内的事件自己处理,范围外的事件依旧为原窗口处理;例如点击该窗口外的view,依然会有响应。另外只要设置了此Flag,都将会启用FLAG_NOT_TOUCH_MODAL,最后,设置了该Flag就表示window不会与输入方法交互,例如该window上有EditView,点击EditView是不会弹出软键盘的。

  • FLAG_NOT_TOUCH_MODAL 表示即使window是处于上面的默认状态下,设置了该Flag,新window范围外的view也是可以响应touch事件。

  • FLAG_NOT_TOUCHABLE 表示该window将不会接受任何touch事件,例如点击该window,不会有响应,只会传给下面有聚焦的窗口。

  • FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS

    表示负责绘制系统栏背景。如果设置,系统栏将以透明背景绘制,此窗口中的相应区域将填充Window#getStatusBarColor()和Window#getNavigationBarColor()中指定的颜色。

  • FLAG_FULLSCREEN

    表示显示此window时隐藏所有屏幕装饰(包括状态栏)

  • FLAG_FORCE_NOT_FULLSCREEN

    表示比FLAG_FULLSCREEN低一级,会显示状态栏

  • FLAG_SHOW_WALLPAPER

    表示要求系统壁纸显示在该window后面,window表面必须是半透明的,才能真正看到它背后的壁纸

  • FLAG_SHOW_WHEN_LOCKED

    表示window显示在锁屏的的界面上。此标志在API27中已废弃,使用R.attr.showWhenLocked或Activity.setShowWhenLocked(boolean)代替。

_format 表示window所需的位图格式

默认为OPAQUE,也有可能是PixelFormat中的一种,另外setColorMode(int)的使用可能会覆盖格式的选择

w、h w表示该window的width,h则是height

可以是具体数值,也可以是LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT

xpos、ypos xpos表示该window的横坐标位置,ypos为纵坐标位置

我们常见的 LayoutParams.x 和LayoutParams.y

Gravity 设置window在屏幕中的位置
token 是一个Binder代理对象,表示window的一个令牌

WMS会检测传入的token是否可以添加到系统上,一般来说,系统会为我们自动添加token。

softInputMode 设置window软键盘输入区域的显示模式

常见的几种设置

  • SOFT_INPUT_ADJUST_NOTHING

    将不会调整大小,直接覆盖在window上。

  • SOFT_INPUT_ADJUST_PAN

    具有输入方法的window可以平移,例如有两个EditView的输入框,一个为Ev1,一个为Ev2,当你点击Ev1想要输入数据时,当前的Ev1的输入框会移到软键盘上方,软件盘是跟在Ev1的下面,保证Ev1是可见的,Ev2则不一定可见。

    另外该模式不能与SOFT_INPUT_ADJUST_RESIZE结合使用。

  • SOFT_INPUT_ADJUST_RESIZE

    整个window会平移调整大小,例如点击一个EditView,整个layout都将平移可见且处于软件盘的上方。

    同样的该模式不能与SOFT_INPUT_ADJUST_PAN结合使用;另外如果窗口的布局参数标志包含FLAG_FULLSCREEN,则将忽略这个值,窗口不会调整大小,但会保持全屏。

  • SOFT_INPUT_ADJUST_UNSPECIFIED

    不指明,系统根据内容自动设置该模式和还是其他模式。

  • SOFT_INPUT_MASK_ADJUST

    window会调整大小以适应软键盘窗口。

  • SOFT_INPUT_STATE_ALWAYS_HIDDEN

    当此window获得焦点时,始终隐藏任何软输入区域。

  • SOFT_INPUT_STATE_ALWAYS_VISIBLE

    当此window获得焦点时,始终显示任何软输入区域。