解释下 layoutParams = new WindowManager.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, height, WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH, PixelFormat.TRANSLUCENT ); layoutParams.setTitle("AllApplistWindow"); layoutParams.setFitInsetsTypes(0); layoutParams.windowAnimations = 0; layoutParams.gravity = Gravity.TOP; windowManager.addView(contentView,layoutParams);
时间: 2024-02-15 22:27:57 浏览: 185
这段代码是用来创建一个新的 Window 并将一个 View 添加到 Window 中。具体来说,它通过创建一个 WindowManager.LayoutParams 对象来控制 Window 的各种属性,如 Window 的宽度、高度、类型、透明度等。其中,WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL 表示这个 Window 的类型是导航栏面板,也就是说这个 Window 是一个浮动在导航栏上方的面板。而 WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE、WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL、WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH、WindowManager.LayoutParams.FLAG_SPLIT_TOUCH 等标志位则控制了 Window 的行为,例如是否可获取焦点、是否可触摸、是否可在触摸区域外处理事件等。最后,通过调用 windowManager 的 addView() 方法将 contentView 添加到 Window 中。
相关问题
layoutParams = new WindowManager.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, height, WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH, PixelFormat.TRANSLUCENT ); layoutParams.setTitle("AllApplistWindow"); layoutParams.setFitInsetsTypes(0); layoutParams.windowAnimations = 0; layoutParams.gravity = Gravity.TOP; windowManager.addView(contentView,layoutParams);
这段代码是用来创建一个浮动窗口,并将其添加到屏幕上显示。其中,WindowManager.LayoutParams是用来设置浮动窗口的属性,包括宽度、高度、类型、标志、透明度等等。这里设置的类型为TYPE_NAVIGATION_BAR_PANEL,表示在导航栏上方显示。标志位中的FLAG_NOT_FOCUSABLE表示该窗口不需要获取焦点,FLAG_NOT_TOUCH_MODAL表示该窗口不会拦截事件,FLAG_WATCH_OUTSIDE_TOUCH表示该窗口会检测外部的触摸事件,FLAG_SPLIT_TOUCH表示该窗口支持多点触控。接着设置了窗口的标题、适合插入的区域类型、动画、重力等属性。最后,将要显示的视图contentView和LayoutParams添加到windowManager中,就可以显示出浮动窗口了。
// 创建 GLSurfaceView 对象 GLSurfaceView glSurfaceView = new GLSurfaceView(this); // 将 GLSurfaceView 添加到 WindowManager 中 WindowManager.LayoutParams params = new WindowManager.LayoutParams( WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY, // 需要添加 SYSTEM_ALERT_WINDOW 权限 WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, PixelFormat.TRANSLUCENT); WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); windowManager.addView(glSurfaceView, params);使用这个代码出现的 permission denied for window type 2038
这个问题是因为你使用了 `TYPE_APPLICATION_OVERLAY` 权限,而这个权限需要在应用的 `AndroidManifest.xml` 文件中添加 `android.permission.SYSTEM_ALERT_WINDOW` 权限声明。你可以尝试在 `AndroidManifest.xml` 文件中添加以下内容:
```
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
```
如果已经添加了这个权限声明并且仍然出现 `permission denied for window type 2038` 错误,那么可能是因为你的应用没有获取到这个权限。你可以在应用启动时请求这个权限,具体方法可以参考 Google 官方文档。
阅读全文