【问题标题】:Is it possible to make a SurfaceView transparent without setZOrderOnTop(true)?是否可以在没有 setZOrderOnTop(true) 的情况下使 SurfaceView 透明?
【发布时间】:2018-07-30 00:12:46
【问题描述】:

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

我也发现了一些关于该主题的主题,但没有正确的答案。 有可能吗?

【问题讨论】:

    标签: java android libgdx surfaceview glsurfaceview


    【解决方案1】:

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

    view.setOpaque(false);
    

    我的解决方案的优点:

    • 提高了 FPS(130 而不是 55)
    • 灵活性

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-16
    • 2011-07-24
    • 1970-01-01
    • 2013-05-21
    • 2020-04-06
    • 2014-06-16
    • 2020-01-22
    相关资源
    最近更新 更多