抱歉我的英文。
我的工作基于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,我有叠加层,但背景为黑色。
有人可以帮助我吗?
答案 0 :(得分:13)
这对我有用:
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/
答案 1 :(得分:2)
我想通过GLSurfaceView顶部的视图完成同样的事情,但我没有找到没有限制的解决方案。首先,glView.setZOrderOnTop(true)给出了正确的透明背景,但无论顺序视图的顺序如何,视图总是在顶部。其次,如果没有ZOrderOnTop,则会维护视图层次结构,但GLSurface背景为黑色或在渲染器中使用glClearColor(红色,绿色,蓝色,alpha)设置的颜色。不幸的是,使用此方法时,alpha参数无效,除非
android:windowIsTranslucent="true"
并且问题在于您可能不希望在OS视图中打孔。应该有一种方法可以轻松地使用openGL实现更加动画的UI。我在没有找到解决方案的情况下搜索了这个网站和其他网站。
答案 2 :(得分:0)
我正在解决同样的问题。我发现你必须打电话给
setZOrderOnTop(true);
getHolder().setFormat(PixelFormat.RGBA_8888);
之前的
setRenderer(...);
祝你好运!
答案 3 :(得分:0)
我还面临着一个同样的问题,当我使用GLSurfaceView
时,没有任何视图。
在获得GLSurfaceView
的引用后,请执行以下操作
glSurface=findViewById(R.id.gl_surfaceview)
//this is the import line only
glSurface.setZOrderOnTop(false)
现在我的所有视图都可以在GLSurfaceView
上看到
谢谢。
答案 4 :(得分:0)
这个问题已经有了一般情况的答案。如果您正在寻找 LibGDX
的解决方案,这里是。
@DarioCastañé 的 answer 但带有 LibGDX 1.9.12
:
(Kotlin 代码):
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)
在幕后,这将做完全相同的事情。