如果没有setZOrderOnTop(true),是否可以使SurfaceView透明?

时间:2018-07-30 00:12:46

标签: java android libgdx surfaceview glsurfaceview

我需要使我的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;

我也没有找到有关该主题的主题,但是没有正确的答案。 可以做到吗?

1 个答案:

答案 0 :(得分:0)

看起来这是不可能的,但是幸运的是,我找到了解决方案。 我只是用纹理视图替换了libgdx android后端源中的表面视图。 另外,我在代码中添加了一行,以使我的纹理视图透明:

view.setOpaque(false);

我的解决方案的优点:

  • 增加了FPS(从130代替55)
  • 灵活性

现在,我可以将libGDX片段视图用作任何普通视图。我可以将其放置在android视图之间,等等。