在Android上动态显示/隐藏多个OpenGL视图

3
我正在使用OpenGL在Android中的GLSurfaceView上动态渲染图像。对于具有多个自定义GLSurfaceView实例的静态基于XML的布局,应用程序运行得非常完美(图像左上角和右上角)。
如果这些实例通过可见性值进行动态交换,则最后一个可见的OpenGL图像仍然位于新图像的顶部(图像底部左侧和右侧)。 左上图片:4个实例,正常大小 右上图片:4个实例,大尺寸 左下图片:1个实例,正常大小(左上图片作为不需要的叠加) 右下图片:1个实例,大尺寸(左上图片作为不需要的叠加) 我到目前为止尝试过的: - 没有删除不需要的实例:
- 通过android::visibility="gone"隐藏未使用的图像(效果不佳) - 将视图移出可见区域并将其调整为0x0大小 - 使用纯色代替动态图像以简化输出 - 通过使视图无效来强制重新绘制视图(实际上我几乎尝试了视图提供的每个函数) - 在onDraw()函数中清除各种缓冲区(实际上我几乎尝试了GLSurfaceView提供的每个函数) - 强制暂停渲染器的onPause()事件 - 使用ViewPager在视图之间切换
- 成功删除了不需要的实例:
- 通过重新进入应用程序重新启动OpenGL(无法像这样使用) - 通过android::visibility="gone"递归隐藏所有其他GLSurfaceView(会导致引擎出现错误,因此停止工作)
不需要的图像不会随布局回流而更改,例如视图的可见性更改。它们仅在一个GLSurfaceView位于另一个GLSurfaceView上时可见(通过android::visibility="gone"隐藏)。如果使用ImageView,则没有问题。第一个创建的实例没有这个问题,因为它位于子堆栈的顶部(或底部?)并位于其同级之上。
我猜Android只支持一个基于OpenGL的视图,该视图由所有GLSurfaceView实例使用。所有实例似乎共享一些偏好设置(特别是可见性),因此不能将其关闭或移出。 GLSurfaceView类:
public class Panel extends GLSurfaceView implements Renderer {
  private static native void nativeRender();

  public Panel(Context context) {
    super(context);

    this.setRenderer(this);
    this.setRenderMode(RENDERMODE_WHEN_DIRTY);
  }

  public void onDrawFrame(GL10 gl) {
    nativeRender();
  }

  public void onSurfaceChanged(GL10 gl, int w, int h) {
    gl.glViewport(0, 0, w, h);
  }
  public void onSurfaceCreated(GL10 gl, EGLConfig config) {
  }
  @Override
  public void surfaceDestroyed(SurfaceHolder holder) {
    super.surfaceDestroyed(holder);
  }

    public void callback() {
        this.requestRender();
    }
}

那么在一个OpenGL视图中使用多个视图(尤其是叠加的视图)是否可能?有没有更好的方法在不使用可见性值的情况下进行交换?

1个回答

1
我曾遇到同样的问题,但一直无法解决。最终我明白了一个GLSurfaceView将会成为顶层视图,如果我们将另一个GLSurfaceView的可见性设置为GONE,它将不会重新出现在屏幕上方。但我用了一个技巧来解决这个问题。我没有隐藏视图,而是将其宽度和高度改为1像素,这使得视图对用户不可见。当我需要显示它时,我通过LayoutParams更改其宽度和高度。这部分地解决了我的问题。以下是我的代码:
    <RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">

<LinearLayout
    android:id="@+id/smallVideoRenderLayoutIncoming"
    android:layout_width="1dp"
    android:layout_height="1dp"
    android:background="@color/transparent"
    android:orientation="vertical"/>


<LinearLayout
    android:id="@+id/largeVideoRenderLayoutIncoming"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"/>

RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(ConstantFunctions.dpToPx(120),ConstantFunctions.dpToPx(170));
smallVideoRenderLayoutIncoming.setLayoutParams(layoutParams);

当我需要展示它时,我会根据需要更改其大小。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接