简体   繁体   English

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

[英]Is it possible to make a SurfaceView transparent without setZOrderOnTop(true)?

I need to make my libGDX GlSufraceView transparent with opportunity to add some android view above. 我需要使我的libGDX GlSufraceView透明,并有机会在上面添加一些android视图。 Earlier I used code below: 之前我使用下面的代码:

if (graphics.getView() instanceof SurfaceView) {
    GLSurfaceView glView = (GLSurfaceView) graphics.getView();
    glView.setZOrderOnTop(true);
    glView.getHolder().setFormat(PixelFormat.RGBA_8888);
}

However, this code does not give me possibility to add android views above. 但是,这段代码并没有给我添加以上android视图的可能性。 After a short research I found replacement: glView.setZOrderMediaOverlay(true); 经过简短的研究,我发现了替换: glView.setZOrderMediaOverlay(true); . With that line of code, I can show any view above surface, but transparent became black. 使用该行代码,我可以在表面上显示任何视图,但是透明变为黑色。

I thought that this problem was due to the fact that my code was launched after setRenderer(...). 我以为这个问题是由于我的代码是在setRenderer(...)之后启动的。 After I found method which contains setRenderer(...) in gdx-backend-android. 在gdx-backend-android中找到包含setRenderer(...)的方法后。 Few moments later I downloaded libGDX sources and add lines before setRenderer(...), but unfortunately it didn't help, situation still the same. 片刻之后,我下载了libGDX源,并在setRenderer(...)之前添加了行,但不幸的是它没有帮助,情况仍然一样。

The code, which I was trying: 我正在尝试的代码:

1) 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) 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) 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;

Also I found few topics about that theme, but there is no right answer. 我也没有找到有关该主题的主题,但是没有正确的答案。 Is is possible to do that? 有可能这样做吗?

Looks like it's impossible, but fortunately, I found the solution. 看起来这是不可能的,但幸运的是,我找到了解决方案。 I just replaced surface view in libgdx android backend sources with texture view. 我只是用纹理视图替换了libgdx android后端源中的表面视图。 Also I added one line in my code, for make my texture view transparent: 我还在代码中添加了一行,以使我的纹理视图透明:

view.setOpaque(false);

Advantages of my solution: 我的解决方案的优势:

  • Increased FPS (130 instead of 55) 每秒帧数提高(由130改为55)
  • Flexibility 灵活性

Now, I can use my libGDX fragment view as any ordinary views. 现在,我可以将libGDX片段视图用作任何普通视图。 I can place it between android views and so on. 我可以将其放置在android视图之间,等等。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM