Android GLSURFACHEVIEW透明背景,不带setZOrderonTop

Android GLSURFACHEVIEW透明背景,不带setZOrderonTop,android,opengl-es,android-relativelayout,glsurfaceview,Android,Opengl Es,Android Relativelayout,Glsurfaceview,对不起我的英语 我的工作是基于 经过数小时的研究,我找到了一些解决方案,但并不是针对我在应用程序中遇到的所有问题。 我有点看电视的麻烦。 我有一个背景,上面有一个relativeLayout、一个GLSurfaceView和一个覆盖图 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/background" android:layou

对不起我的英语

我的工作是基于

经过数小时的研究,我找到了一些解决方案,但并不是针对我在应用程序中遇到的所有问题。 我有点看电视的麻烦。 我有一个背景,上面有一个relativeLayout、一个GLSurfaceView和一个覆盖图

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/background"
    android:layout_width="match_parent"
    android:background="@layout/backgroundrepeat"
    android:layout_height="match_parent">
<com.m2y.foxprez.view.CurlView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/openglview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
<RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/overlay"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
</RelativeLayout>
在我的渲染器中:

public void onSurfaceCreated(GL10 gl, EGLConfig config) {
    gl.glClearColor(0f, 0f, 0f, 0f);
    gl.glShadeModel(GL10.GL_SMOOTH);
    gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);
    gl.glHint(GL10.GL_LINE_SMOOTH_HINT, GL10.GL_NICEST);
    gl.glHint(GL10.GL_POLYGON_SMOOTH_HINT, GL10.GL_NICEST);
    gl.glEnable(GL10.GL_LINE_SMOOTH);
    gl.glDisable(GL10.GL_DEPTH_TEST);
    gl.glDisable(GL10.GL_CULL_FACE);
}

public synchronized void onDrawFrame(GL10 gl) {
    gl.glClearColor(0f,0f,0f,0f);
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
    gl.glLoadIdentity();
}
经过多次研究,我目前被以下结果所阻碍:
使用setZOrderOnTop,我有背景,但覆盖在视图下。
使用setZOrderMediaOverlay,我得到了覆盖,但背景是黑色的

有人能帮我吗?

这对我很有用:

final GLSurfaceView glView = (GLSurfaceView) findViewById(R.id.glView);

glView.setZOrderOnTop(true);
glView.setEGLConfigChooser(8, 8, 8, 8, 16, 0);
glView.getHolder().setFormat(PixelFormat.RGBA_8888);
glView.setRenderer(new MyRenderer());
glView.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);

在此处找到:

我想在GLSURFACHEVIEW顶部的视图上完成同样的事情,我还没有找到没有限制的解决方案。首先,glView.setZOrderOnTop(true)提供了正确的透明背景,但无论视图的顺序如何,视图始终位于顶部。其次,如果没有ZOrderOnTop,则视图层次将保持不变,但GLSurface背景为黑色或渲染器中使用glClearColor(红色、绿色、蓝色、alpha)设置的颜色。不幸的是,alpha参数在使用此方法时没有效果,除非

android:windowIsTranslucent="true"

问题是,您可能不想在OS视图中打一个洞。对于使用openGL的更具动画效果的UI,应该有一种方法可以轻松实现这一点。我搜索了这个站点和其他站点,但没有找到解决方案。

我正在处理相同的问题。我发现你必须为我打电话

setZOrderOnTop(true);
getHolder().setFormat(PixelFormat.RGBA_8888);
在打电话给

setRenderer(...);

祝你好运

当我使用
GLSurfaceView
时,我还面临着同样的问题,即没有显示任何视图

在获得
GLSurfaceView
的引用后,执行以下操作

glSurface=findViewById(R.id.gl_surfaceview)

//this is the import line only

glSurface.setZOrderOnTop(false)
现在,我的所有视图都显示在
GLSurfaceView


谢谢。

这个问题对于一般情况已经有了答案。如果您正在寻找使用
LibGDX
的解决方案,请点击这里

@DarioCastañés,但带有
LibGDX 1.9.12

(科特林代码):

val config=AndroidApplicationConfiguration().apply{
r=8
g=8
b=8
a=8
深度=16
模具=0
}
val view=initializeForView(MyGame(),config)
如果(视图为GLSURFACHEVIEW){
view.setZOrderOnTop(true)
view.holder.setFormat(PixelFormat.RGBA_8888)
}
返回视图//在片段中
setContentView(视图)//在活动中
render()
方法中:

Gdx.gl.glClearColor(0f,0f,0f,0f)
Gdx.gl.glClear(GL20.gl\u颜色\u缓冲\u位)

在引擎盖下,这将做完全相同的事情。

您能在opengl视图前面添加一些覆盖吗?我还发现了一些其他的解决方案,比如在opengl中创建我的覆盖,但是如果有人有一个解决方案可以帮助我编辑:当我谈到覆盖时,我谈到的是一个相对布局(而不是opengl视图的一个元素),我没有尝试。实际上,我在尝试相反的方法时发现了这个问题。我在代码中尝试了这个方法,但它不起作用,在设置着色器时有问题吗?
glSurface=findViewById(R.id.gl_surfaceview)

//this is the import line only

glSurface.setZOrderOnTop(false)