Android API23+ 如何绘制自定义ViewGroup且不遮挡下层视图可交互
问题原因
你的无障碍悬浮窗默认会消费全部触摸事件,导致下层应用的控件无法接收触摸输入。
修复方案
修改WindowManager.LayoutParams的flag配置,新增FLAG_NOT_TOUCHABLE和FLAG_NOT_FOCUSABLE两个属性即可。这两个属性会让悬浮窗完全不接收、不消费任何触摸事件,所有触摸操作直接透传给下层界面,同时不影响你在全屏自定义View上绘制指定位置的红色矩形。
修改后的代码示例
val drw = DrawingView(this) val params = WindowManager.LayoutParams() params.flags = WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH or // 新增:禁止当前窗口接收触摸事件,所有触摸透传给下层 WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE or // 新增:禁止当前窗口获取焦点,避免抢占输入法等系统交互 WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE params.type = WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY params.format = PixelFormat.TRANSLUCENT val wm = getSystemService(WINDOW_SERVICE) as WindowManager wm.addView(drw, params)
补充说明
如果后续需要实现点击红色矩形触发自定义操作的需求,可在检测到触摸位置落在矩形范围内时,动态移除FLAG_NOT_TOUCHABLE属性即可;不需要绘制功能时可直接从WindowManager移除自定义View节省资源。
内容的提问来源于stack exchange,提问作者Nikoloz Chitashvili
相关产品推荐
相关产品推荐

