文章目录
一、LayoutParams.type
表示窗口的类型,type 大的会遮住 type 小的,相同的看焦点在谁身上。刚打开的 Window 会自动拥有焦点。
值范围 | 表示类型 | 说明 | 要求 |
---|---|---|---|
0 - 999 | 应用程序窗口 | 一般情况下应用显示的窗口就是此类型 | 无 |
1000 - 1999 | 子窗口,也可以叫普通弹窗 | Dialog 或 PopWindow 等显示的类型,type 值较高,会显示在应用程序窗口之上 | 普通弹窗显示需要一个依附的 window ,弹窗的显示需要 token 非空,token 来自依附的 window |
2000 - 2999 | 系统级窗口 | 最高等级的窗口,一般作为系统自身应用使用,例如来电、下拉屏的显示等等 | 要求应用程序安装于 /system/app,签名需要使用系统签名,2038 特殊值除外 |
public static final int FIRST_SYSTEM_WINDOW = 2000;
public static final int TYPE_APPLICATION_OVERLAY = FIRST_SYSTEM_WINDOW + 38;
特殊值 2038,即 TYPE_APPLICATION_OVERLAY,该值是唯一不用作为系统应用就可以使用的系统级窗口。如果有需要遮住 0 - 1999 的,使用即可。
使用 2038 特殊值:
- manifest 中添加权限:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
- 代码中对SDK版本判断(Android 6 后需要用户手动允许,不然不给用,对应 SDK 为 23,代码为 Build.VERSION_CODES.M)
//如果没有权限就跳转设置去给权限,权限申请方式很多,这个不能用在实际中,只是做个表示
if (!Settings.canDrawOverlays(this)) {
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
startActivity(intent);
return;
}
系统级窗口中,除了特殊值 2038 ,若要使用,应用程序必须是安装在 /system/app 下且签名使用系统签名,才可以使用。测试玩的话,可以用 adb push、打包系统签名安装来测。
二、LayoutParams.flags
定义窗口的行为,只记录未被弃用的,有些在SDK30,SDK27等弃用的就没记录。
名称 | 值 | 含义 |
---|---|---|
FLAG_ALLOW_LOCK_WHILE_SCREEN_ON | 1 (0x00000001) | 只要该窗口对用户可见,允许锁定屏幕在屏幕打开时激活。这可以单独使用,也可以与FLAG_KEEP_SCREEN_ON和/或FLAG_SHOW_WHEN_LOCKED结合使用 |
FLAG_ALT_FOCUSABLE_IM | 131072 (0x00020000) | 当设置时,反转窗口的输入法聚焦性。设置这个标志的效果取决于是否设置了FLAG_NOT_FOCUSABLE: 如果没有设置FLAG_NOT_FOCUSABLE,即当窗口是可聚焦的,设置这个标志可以防止该窗口成为输入法的目标。因此,它将不能与输入法交互,并且将被分层在输入法之上(除非在它之上有另一个输入法目标)。 如果设置了FLAG_NOT_FOCUSABLE,则设置此标志将请求将窗口作为输入法目标,即使该窗口不可聚焦。因此,它将被置于输入法的下面。注意:设置了FLAG_NOT_FOCUSABLE的窗口不能与输入法交互,不管这个标志是什么 |
FLAG_BLUR_BEHIND | 4 (0x00000004) | 模糊显示 Window 后面的内容 |
FLAG_DIM_BEHIND | 2 (0x00000002) | Window 后的视图都会变暗。使用dimAmount来控制暗度 |
FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS | -2147483648 (0x80000000) | 标志表示此窗口负责绘制系统栏的背景。如果设置了,系统栏将以透明的背景绘制,该窗口中的相应区域将用window #getStatusBarColor()和window #getNavigationBarColor()中指定的颜色填充 |
FLAG_HARDWARE_ACCELERATED | 16777216 (0x01000000) | 请求硬件加速显示该 Window。请求硬件加速并不能保证它会发生,需要在设置显示的 View 之前设置,并且硬件加速被禁用之后不能使用该 flags |
FLAG_IGNORE_CHEEK_PRESSES | 32768 (0x00008000) | 窗口会积极过滤事件流,以防止在这种情况下无意的按压,当这样的事件流检测到,应用程序将收到一个CANCEL运动事件来指示这一点,因此应用程序可以相应地处理,不采取任何行动,直到手指被释放 |
FLAG_KEEP_SCREEN_ON | 128 (0x00000080) | 只要这个窗口对用户是可见的,保持设备的屏幕打开和明亮,Window 常亮和不遮挡 |
FLAG_LAYOUT_IN_SCREEN | 256 (0x00000100) | 将窗口置于整个屏幕中,忽略来自父窗口的任何约束。注意:在有DisplayCutout的显示器上,如果必要,根据layoutInDisplayCutoutMode,可以将窗口放置为避免DisplayCutout区域 |
FLAG_LAYOUT_NO_LIMITS | 512 (0x00000200) | 允许窗口扩展到屏幕之外,宽高超过屏幕的大小 |
FLAG_LOCAL_FOCUS_MODE | 268435456 (0x10000000) | 标志为处于本地聚焦模式的窗口。处于本地聚焦模式的窗口可以使用windows# setLocalFocus(boolean, boolean)独立于窗口管理器控制焦点。通常这种模式下的窗口不会从窗口管理器获得触摸/按键事件,而只会通过使用windows# injectInputEvent(InputEvent)的本地注入获得事件 |
FLAG_NOT_FOCUSABLE | 8 (0x00000008) | 这个窗口永远不会得到按键输入焦点,所以用户不能向它发送按键或其他按键事件。这些将会转到后面的可聚焦窗口。无论是否显式设置,此标志也将启用FLAG_NOT_TOUCH_MODAL。设置这个标志还意味着窗口将不需要与软输入法交互,因此它将是Z-ordered,并独立于任何活动输入法(通常这意味着它在输入法之上得到Z-ordered,因此它可以使用全屏显示其内容,并在需要时覆盖输入法。您可以使用FLAG_ALT_FOCUSABLE_IM来修改此行为 |
FLAG_NOT_TOUCHABLE | 16 (0x00000010) | 这个 Window 不会接收任何触碰事件 |
FLAG_NOT_TOUCH_MODAL | 32 (0x00000020) | 不接受非 Window 区域的事件,多个不重叠的 Window 能各接收各的事件 |
FLAG_SCALED | 16384 (0x00004000) | 显示在 Window 中的视图会进行缩放填充 |
FLAG_SECURE | 8192 (0x00002000) | 设置当前窗口不会被截图之类的操作 |
FLAG_SHOW_WALLPAPER | 1048576 (0x00100000) | 要求系统墙纸显示在窗口后面。窗户表面必须是半透明的,以便能够看到后面的墙纸;这个标志只是确保墙纸表面将在那里,所以不设置透明度并不能看到壁纸 |
FLAG_SPLIT_TOUCH | 8388608 (0x00800000) | 当设置该窗口时,该窗口将接受超出其边界的触摸事件发送到其他也支持分割触摸的窗口。当这个标志没有设置时,第一个向下的指针决定了所有后续触摸的窗口,直到所有指针向上为止。当设置了这个标志时,每个向下的指针(不一定是第一个)决定了该指针的所有后续触摸都将指向哪个窗口,直到该指针向上,从而允许多个指针的触摸被拆分到多个窗口 |
FLAG_WATCH_OUTSIDE_TOUCH | 262144 (0x00040000) | 如果你设置了FLAG_NOT_TOUCH_MODAL,你可以设置这个标志来接收一个带有动作MotionEvent的特殊的MotionEvent。ACTION_OUTSIDE用于在窗口之外发生的触摸。注意,您不会收到完整的向下/移动/向上手势,只会收到第一个向下的位置作为ACTION_OUTSIDE |
三、Gravity、dimAmount、buttonBrightness、Alpha、format
Gravity:和布局中的 layout_gravity 效果类似,根据值确定,在屏幕中的哪里显示。
dimAmount:当 flags 设置了 FLAG_DIM_BEHIND 时,这是要应用的调光量。范围从1.0(全黑)到0.0(全亮)。
buttonBrightness:这可以用来覆盖按钮和键盘背光的标准行为。如果值小于0(默认值),则表示使用标准背光行为。0到1调整亮度从黑暗到充分明亮。
alpha:Window 的透明度
format:所需的位图格式。可能是PixelFormat中的常量之一。格式的选择可能会被setColorMode(int)覆盖。默认是不透明的。
四、x、y、windth、heigth
x:Window 所在的横坐标
y:Window 所在的纵坐标
width:窗口显示的宽度
heighth:窗口显示的高度