【问题标题】:Android GLSurfaceView transparent background without setZOrderonTop没有setZOrderonTop的Android GLSurfaceView透明背景
【发布时间】:2013-05-21 16:30:36
【问题描述】:

对不起我的英语。

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

有人可以帮助我吗?

【问题讨论】:

    标签: android opengl-es android-relativelayout glsurfaceview


    【解决方案1】:

    这对我有用:

    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/

    【讨论】:

    • 你能在你的opengl视图上放一些覆盖吗?我找到了其他一些解决方案,比如我在 opengl 中的叠加,但是如果有人有一个可以帮助我编辑的解决方案:当我谈到叠加时,我说的是相对布局(不是我的 opengl 视图的元素)跨度>
    • 我没试过。实际上,我在尝试相反的情况时发现了这一点。
    • 我在我的代码中尝试了这个东西,但它不起作用,设置着色器有什么问题吗?
    • 它在一个问题中说“没有setZOrderonTop”,为什么几乎所有答案都包含这种方法?
    【解决方案2】:

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

    android:windowIsTranslucent="true"
    

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

    【讨论】:

      【解决方案3】:

      这个问题已经有了一般情况的答案。如果您正在寻找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)
      

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

      【讨论】:

        【解决方案4】:

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

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

        在调用之前

        setRenderer(...);
        

        祝你好运!

        【讨论】:

          【解决方案5】:

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

          在得到GLSurfaceView的引用后这样做

          glSurface=findViewById(R.id.gl_surfaceview)
          
          //this is the import line only
          
          glSurface.setZOrderOnTop(false)
          

          现在我的所有视图都显示在 GLSurfaceView 之上

          谢谢。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-12-20
            • 2016-12-02
            • 2011-08-08
            相关资源
            最近更新 更多