Android 悬浮窗不拦截点击事件
悬浮窗基本设置代码如下:
windowManager = (WindowManager) getApplication().getSystemService(Context.WINDOW_SERVICE);
layoutParams = new WindowManager.LayoutParams();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
layoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
} else {
layoutParams.type = WindowManager.LayoutParams.TYPE_PHONE;
}
layoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
添加 FLAG_NOT_TOUCH_MODAL 和 FLAG_NOT_FOCUSABLE 后,浮窗外的点击事件由浮窗外响应,但是浮窗内的点击事件,则浮窗给响应了。
如果要浮窗内的点击事件也由浮窗外即浮窗的下面的界面响应,则添加改 flag 标志即可。
layoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
// 加上这句话悬浮窗不拦截事件
| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;
FLAG_NOT_TOUCHABLE 的意思是
/** Window flag: this window can never receive touch events. */
这个窗口永远不能接收触摸事件。
对于只想叠加一层悬浮层的 UI 显示,但是又想底下的 Activity 响应点击事件等,可以这样处理。
顺便说一下,如果想让悬浮窗 UI 是透明的,不遮挡底下 Activity 的 UI,设置
// 这行配置是整体的透明度,全透明也会把布局中的内容给透明掉
// layoutParams.alpha = 0.f;
这个属性是不合理的,它也会把浮窗的内容都给透明掉。
可以这样设置
// 这行配置 + 布局中的设置背景色为透明色有效果。
layoutParams.format = PixelFormat.RGBA_8888;
浮窗的 layout 根布局的背景添加透明色设置
android:background="@android:color/transparent"
如果不加 format 的这行配置,只加 background 这个透明设置,会发现整个浮窗是黑色的。