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

时间:2011-11-14 15:54:56

标签: android android-layout opengl-es glsurfaceview

我正在使用OpenGL在android中的GLSurfaceView上动态渲染图像。 该应用程序可以完美地运行(静态)基于XML的布局,并具有自定义GLSurfaceView的多个实例。 (图片左上角和右上角)

如果这些实例通过可见性值动态交换,则最后一个可见的OpenGL图像仍然位于新的可见顶部之上。 (图像左下角和右下角)

http://www.abload.de/img/appxbunc.jpg

左上角图片: 4个实例,正常大小

右上角图片: 4个实例,大尺寸

左下角图片: 1个实例,正常尺寸(左上图为不需要的叠加)

右下图: 1个实例,大尺寸(左上图为不需要的叠加)

到目前为止我尝试了什么:

  • 没有删除不需要的实例:
    • 通过android :: visibility =“gone”隐藏未使用的图像(不能正常工作)
    • 将视图移出可见区域并将其调整为0到0
    • 使用纯色而不是动态图像来简化输出
    • 通过使视图无效来强制重绘视图(我实际上几乎尝试了视图提供的每个功能)
    • 清除onDraw()中的各种缓冲区 - 函数(我实际上尝试了GLSurfaceView提供的几乎所有函数)
    • 强制onPause() - 事件以停止渲染器
    • 使用ViewPager在视图之间切换
  • 成功删除了不需要的实例:
    • 通过重新输入应用程序重启OpenGL(不能像这样使用)
    • 通过android :: visibility =“gone”递归隐藏所有其他GLSurfaceViews(错误引擎,因此它停止工作)

不需要的图像不会随着布局回流而改变,例如视图的可见性更改。 只有当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 个答案:

答案 0 :(得分:0)

我遇到了同样的问题并且无法解决问题,因为我终于明白,如​​果我们制作另一个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);

当我需要显示它时,我根据需要更改了它的大小。