Android 12触摸事件无法穿透系统,FLAG_SLIPPERY问题求助
解决Android 12摩托罗拉设备上触摸事件无法穿透悬浮窗的问题
首先,你遇到的FLAG_SLIPPERY是Android 12引入的系统标记——当应用处于Letterbox模式(比如应用未适配设备屏幕宽高比,系统自动添加黑边)时,系统会给对应的窗口加上这个标记,阻止触摸事件穿透到下层系统界面。结合你的场景,给出以下几种可行的解决思路:
1. 显式清除FLAG_SLIPPERY标记
由于FLAG_SLIPPERY是系统内部未公开的标记,需要通过反射移除它。在调用windowManager.addView()之前,添加这段代码:
try { Field slipperyFlagField = WindowManager.LayoutParams.class.getField("FLAG_SLIPPERY"); int FLAG_SLIPPERY = slipperyFlagField.getInt(null); canvasLayoutParams_vi.flags &= ~FLAG_SLIPPERY; } catch (NoSuchFieldException | IllegalAccessException e) { e.printStackTrace(); }
这段代码会反射获取该标记的值,并从窗口参数的flags中清除它,尝试恢复触摸事件的穿透能力。
2. 避免触发Letterbox模式
报错里的Letterbox_left_ActivityRecord说明你的应用当前处于Letterbox模式,这是系统自动添加的黑边窗口导致的。可以通过以下方式规避:
- 在
AndroidManifest.xml中为目标Activity添加android:resizeableActivity="true",并配置合适的android:screenOrientation,确保应用适配设备屏幕宽高比。 - 如果应用固定为竖屏,可在Manifest中添加:
这里的<activity android:name=".MainActivity" android:resizeableActivity="false" android:screenOrientation="portrait"> <meta-data android:name="android.max_aspect" android:value="2.4" /> </activity>android.max_aspect设置为覆盖设备最大宽高比的值(比如摩托罗拉Edge 30的20:9对应2.22,设为2.4可兼容大部分设备),避免系统自动添加Letterbox黑边。
3. 调整窗口触摸事件处理
在你的EmptyView中重写onTouchEvent方法,强制返回false,让触摸事件继续向下传递:
public class EmptyView extends View { // 构造方法实现... @Override public boolean onTouchEvent(MotionEvent event) { // 不消耗触摸事件,允许事件穿透到下层界面 return false; } }
同时确保你的窗口参数已经正确设置FLAG_NOT_TOUCH_MODAL | FLAG_NOT_FOCUSABLE,这两个标记是窗口不拦截触摸事件的基础配置。
内容的提问来源于stack exchange,提问作者MIDDLE
相关产品推荐
相关产品推荐

