WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
时间: 2024-03-29 19:41:07 浏览: 12
WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE是Android中的一个窗口标志位,用于标识该窗口不接收触摸事件。该标志位可以用于在屏幕上创建一个不可交互的视图,例如显示一个进度条或提示框时,防止用户误操作。设置该标志位的方法是通过WindowManager.LayoutParams对象的flags属性进行设置。
相关问题
// 创建 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 官方文档。
如何通过windowManager添加glsurfaceview?
通过 WindowManager 添加 GLSurfaceView 的基本步骤如下:
1. 在 Service 中创建一个 GLSurfaceView 对象,并将其添加到 WindowManager 中:
```java
// 创建 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);
```
其中,`TYPE_APPLICATION_OVERLAY` 是在 Android 8.0 及以上版本中可用的一种窗口类型,用于在应用程序之上显示窗口。需要添加 `SYSTEM_ALERT_WINDOW` 权限才能使用该窗口类型。
2. 实现 GLSurfaceView.Renderer 接口,并在其中实现必要的渲染逻辑:
```java
class MyRenderer implements GLSurfaceView.Renderer {
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
// 执行必要的初始化操作
}
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
// 处理窗口尺寸变化事件
}
@Override
public void onDrawFrame(GL10 gl) {
// 执行渲染操作
}
}
// 设置 Renderer
glSurfaceView.setRenderer(new MyRenderer());
```
在实现 GLSurfaceView.Renderer 接口时,你需要实现 `onSurfaceCreated`、`onSurfaceChanged` 和 `onDrawFrame` 三个方法,分别用于初始化、处理窗口尺寸变化和渲染操作。
3. 在 Service 的 onDestroy 方法中,移除 GLSurfaceView:
```java
@Override
public void onDestroy() {
super.onDestroy();
windowManager.removeView(glSurfaceView);
}
```
以上就是通过 WindowManager 添加 GLSurfaceView 的基本步骤。需要注意的是,添加 GLSurfaceView 后,你需要自己管理 EGL 上下文和表面,以确保正确的渲染和显示。