问题 没有setZOrderonTop的Android GLSurfaceView透明背景


对不起我的英语不好。

我的工作是基于 https://github.com/harism/android_page_curl/

经过几个小时的研究,我找到了一些解决方案,但不是我在申请中遇到的所有问题。 我对GLSurfaceView有些麻烦。 我有一个背景,有一个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>

当我开始我的观点时:

setEGLConfigChooser(8,8,8,8,16,0);
setRenderer(renderer);
getHolder().setFormat(PixelFormat.TRANSLUCENT);
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
setZOrderMediaOverlay(true);

在我的渲染器中:

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,我有叠加层,但背景为黑色。

有人可以帮帮我吗?


13018
2018-05-26 18:56


起源

我有同样的问题,你有没有找到解决方案? - aez
发现任何解决方案 - yarin


答案:


这对我有用:

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

在这里找到: http://andrewhague.wordpress.com/2011/05/24/how-to-set-a-transparent-glsurfaceview/


11
2018-06-01 13:02



你可以在opengl视图上放置一些叠加前端吗?我找到了一些其他的解决方案,比如我在opengl中的叠加,但是如果有人有一个可以帮助我编辑的解决方案:当我谈到叠加时,我说的是相对布局(不是我的opengl视图的元素) - user2422856
我没试过。实际上,我在尝试相反时发现了这一点。 - Dario Castañé
我在我的代码中尝试了这个东西,但它没有用,设置着色器有什么问题吗? - mayank_droid


我想在GLSurfaceView顶部查看完成同样的事情,我没有找到没有限制的解决方案。首先,glView.setZOrderOnTop(true)给出了正确的透明背景,但无论顺序视图的顺序如何,视图总是在顶部。其次,如果没有ZOrderOnTop,则会保留视图层次结构,但GLSurface背景为黑色或在渲染器中使用glClearColor(红色,绿色,蓝色,alpha)设置的颜色。不幸的是,除非使用此方法,否则alpha参数无效

android:windowIsTranslucent="true"

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


2
2018-02-06 20:19





我正在解决同样的问题。我发现你必须打电话给

setZOrderOnTop(true);
getHolder().setFormat(PixelFormat.RGBA_8888);

在打电话之前

setRenderer(...);

祝你好运!


0
2018-03-09 18:10





我也遇到了同样的问题,当我使用时没有任何视图显示 GLSurfaceView

得到参考后 GLSurfaceView 这样做

glSurface=findViewById(R.id.gl_surfaceview)

//this is the import line only

glSurface.setZOrderOnTop(false)

现在我的所有视图都可见 GLSurfaceView

谢谢。


0
2017-07-31 08:24



但它正在做黑色背景。没工作 - Nikunj Paradva