在gl视图之间切换Android会导致应用冻结

时间:2016-09-28 12:20:31

标签: java android android-activity android-view rajawali

我还在学习如何在Android中编程,我创建了一个带有起始视图的活动:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.my_activity);

        mMainView = (RajawaliSurfaceView) findViewById(R.id.my_view);
        mMainView.setSurfaceRenderer(new Renderer());
        mMainView.setZOrderOnTop(false);

        // Also set up a surface view I'd like to switch on back and forth
        mGLView = new GLSurfaceView(this);
        mGLView.setEGLContextClientVersion(2);
        mGLView.setDebugFlags(GLSurfaceView.DEBUG_CHECK_GL_ERROR);
        mGLView.setRenderer(cameraRenderer_ = new GLRenderer(this));
        mGLView.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
    }

这很有效,我甚至可以无缝切换到GL视图:

public void switchToGLView(View view) {
  setContentView(mGLView);
}

但是在我完成了GL之后,我在我的主要活动中调用了GLRenderer恢复功能

public void restoreRenderer() {
  // Restoring the previous view (my_view) with the non-GL renderer
  setContentView(mMainView); <<<<<< FREEZES HERE (blackscreen)
}

,不幸的是,这种情况永远不会起作用:屏幕在前一个GL渲染器中保持黑色,并通过调试我发现的setContentView行:

  • 我在Android监视器中没有任何错误或警告日志

  • 执行从不继续。它永远陷入困境

有关如何解决此问题的任何提示或提示?

1 个答案:

答案 0 :(得分:0)

您可以使用Frame或Relative布局解决此问题。 如果我理解正确,mMainView和mGLView都是全屏的。 有几个选择:

您可以更改观看次数的可见性:

public void switchViews() {
  if(mMainView.getVisibility() == View.VISIBLE){
     mMainView.setVisibility(View.GONE);
     mGLView.setVisibility(View.VISIBLE);
  } else{
     mMainView.setVisibility(View.VISIBLE);
     mGLView.setVisibility(View.GONE);
  }
}

另一个选项是更改视图的Z顺序:

public void switchViews(View view){
  view.bringToFront();
  view.invalidate();
}

除非您使用上述方法遇到任何缺点。