LayoutParams是什么
LayoutParams继承于Android.View.ViewGroup.LayoutParams
LayoutParams表示包含了layout宽高,位置,类型等信息,通过设置这些信息,生成不同的view。
LayoutParams类也只是简单的描述了宽高,宽和高都可以设置成三种值
- 一个确定的值
- FILL_PARENT,即填满(和父容器一样大小)
- 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获得焦点时,始终显示任何软输入区域。