是否可以在没有 setZOrderOnTop(true) 的情况下使 SurfaceView 透明?
Is it possible to make a SurfaceView transparent without setZOrderOnTop(true)?
我需要让我的 libGDX GlSufraceView 透明,并有机会在上面添加一些 android 视图。早些时候我使用了下面的代码:
if (graphics.getView() instanceof SurfaceView) {
GLSurfaceView glView = (GLSurfaceView) graphics.getView();
glView.setZOrderOnTop(true);
glView.getHolder().setFormat(PixelFormat.RGBA_8888);
}
但是,此代码不允许我在上面添加 android 视图。经过短暂的研究,我找到了替代品: glView.setZOrderMediaOverlay(true);
。
使用那行代码,我可以显示表面上方的任何视图,但透明变成黑色。
我认为这个问题是因为我的代码是在 setRenderer(...) 之后启动的。在我找到 gdx-backend-android 中包含 setRenderer(...) 的方法之后。片刻之后,我下载了 libGDX 源代码并在 setRenderer(...) 之前添加了行,但不幸的是它没有帮助,情况还是一样。
我正在尝试的代码:
1)
GLSurfaceView20 view = new GLSurfaceView20(application.getContext(), resolutionStrategy, config.useGL30 ? 3 : 2);
view.setZOrderOnTop(true);
if (configChooser != null)
view.setEGLConfigChooser(configChooser);
else
view.setEGLConfigChooser(config.r, config.g, config.b, config.a, config.depth, config.stencil);
view.getHolder().setFormat(PixelFormat.RGBA_8888);
view.setRenderer(this);
view.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
return view;
2)
GLSurfaceView20 view = new GLSurfaceView20(application.getContext(), resolutionStrategy, config.useGL30 ? 3 : 2);
if (configChooser != null)
view.setEGLConfigChooser(configChooser);
else
view.setEGLConfigChooser(config.r, config.g, config.b, config.a, config.depth, config.stencil);
view.setZOrderOnTop(true);
view.getHolder().setFormat(PixelFormat.RGBA_8888);
view.setRenderer(this);
return view;
3)
GLSurfaceView20 view = new GLSurfaceView20(application.getContext(), resolutionStrategy, config.useGL30 ? 3 : 2);
if (configChooser != null)
view.setEGLConfigChooser(configChooser);
else
view.setEGLConfigChooser(config.r, config.g, config.b, config.a, config.depth, config.stencil);
view.getHolder().setFormat(PixelFormat.RGBA_8888);
view.setZOrderMediaOverlay(true);
view.setEGLContextClientVersion(2);
view.setRenderer(this);
return view;
我也发现了一些关于那个主题的话题,但没有正确答案。
可以这样做吗?
看起来不可能,但幸运的是,我找到了解决办法。
我只是用纹理视图替换了 libgdx android 后端源中的表面视图。
我还在我的代码中添加了一行,以使我的纹理视图透明:
view.setOpaque(false);
我的解决方案的优点:
- 提高 FPS(130 而不是 55)
- 灵活性
现在,我可以像使用任何普通视图一样使用 libGDX 片段视图。我可以将它放在 android 视图之间等等。
我需要让我的 libGDX GlSufraceView 透明,并有机会在上面添加一些 android 视图。早些时候我使用了下面的代码:
if (graphics.getView() instanceof SurfaceView) {
GLSurfaceView glView = (GLSurfaceView) graphics.getView();
glView.setZOrderOnTop(true);
glView.getHolder().setFormat(PixelFormat.RGBA_8888);
}
但是,此代码不允许我在上面添加 android 视图。经过短暂的研究,我找到了替代品: glView.setZOrderMediaOverlay(true);
。
使用那行代码,我可以显示表面上方的任何视图,但透明变成黑色。
我认为这个问题是因为我的代码是在 setRenderer(...) 之后启动的。在我找到 gdx-backend-android 中包含 setRenderer(...) 的方法之后。片刻之后,我下载了 libGDX 源代码并在 setRenderer(...) 之前添加了行,但不幸的是它没有帮助,情况还是一样。
我正在尝试的代码:
1)
GLSurfaceView20 view = new GLSurfaceView20(application.getContext(), resolutionStrategy, config.useGL30 ? 3 : 2);
view.setZOrderOnTop(true);
if (configChooser != null)
view.setEGLConfigChooser(configChooser);
else
view.setEGLConfigChooser(config.r, config.g, config.b, config.a, config.depth, config.stencil);
view.getHolder().setFormat(PixelFormat.RGBA_8888);
view.setRenderer(this);
view.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
return view;
2)
GLSurfaceView20 view = new GLSurfaceView20(application.getContext(), resolutionStrategy, config.useGL30 ? 3 : 2);
if (configChooser != null)
view.setEGLConfigChooser(configChooser);
else
view.setEGLConfigChooser(config.r, config.g, config.b, config.a, config.depth, config.stencil);
view.setZOrderOnTop(true);
view.getHolder().setFormat(PixelFormat.RGBA_8888);
view.setRenderer(this);
return view;
3)
GLSurfaceView20 view = new GLSurfaceView20(application.getContext(), resolutionStrategy, config.useGL30 ? 3 : 2);
if (configChooser != null)
view.setEGLConfigChooser(configChooser);
else
view.setEGLConfigChooser(config.r, config.g, config.b, config.a, config.depth, config.stencil);
view.getHolder().setFormat(PixelFormat.RGBA_8888);
view.setZOrderMediaOverlay(true);
view.setEGLContextClientVersion(2);
view.setRenderer(this);
return view;
我也发现了一些关于那个主题的话题,但没有正确答案。 可以这样做吗?
看起来不可能,但幸运的是,我找到了解决办法。 我只是用纹理视图替换了 libgdx android 后端源中的表面视图。 我还在我的代码中添加了一行,以使我的纹理视图透明:
view.setOpaque(false);
我的解决方案的优点:
- 提高 FPS(130 而不是 55)
- 灵活性
现在,我可以像使用任何普通视图一样使用 libGDX 片段视图。我可以将它放在 android 视图之间等等。