16

对不起我的英语不好。

我的工作基于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,我得到了覆盖,但背景是黑色的。

有人可以帮助我吗?

4

5 回答 5

16

这对我有用:

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/

于 2013-06-01T13:02:53.073 回答
3

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

android:windowIsTranslucent="true"

这样做的问题是您可能不想在操作系统视图中打一个洞。应该有一种方法可以轻松地使用 openGL 来实现更动画的 UI。我已经搜索了这个站点和其他站点,但没有找到解决方案。

于 2014-02-06T20:19:24.433 回答
0

对于一般情况,这个问题已经有了答案。如果您正在寻找解决方案LibGDX,这里就是。

@DarioCastañé 的回答,但有LibGDX 1.9.12

(科特林代码):

val config = AndroidApplicationConfiguration().apply {
    r = 8
    g = 8
    b = 8
    a = 8
    depth = 16
    stencil = 0
}

val view = initializeForView(MyGame(), config)

if (view is GLSurfaceView) {
    view.setZOrderOnTop(true)
    view.holder.setFormat(PixelFormat.RGBA_8888)
}

return view // in Fragment
setContentView(view) // in Activity

在你的render()方法中:

Gdx.gl.glClearColor(0f, 0f, 0f, 0f)
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT)

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

于 2021-01-25T16:15:25.153 回答
-1

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

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

在致电之前

setRenderer(...);

祝你好运!

于 2018-03-09T18:10:28.573 回答
-1

我也遇到了同样的问题,当我使用GLSurfaceView.

在得到GLSurfaceView这样做的参考之后

glSurface=findViewById(R.id.gl_surfaceview)

//this is the import line only

glSurface.setZOrderOnTop(false)

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

谢谢。

于 2018-07-31T08:24:01.117 回答