出于某种原因,我需要重新启动一个GLSurfaceView.Renderer,所以我想在我的应用程序中第二次调用setRenderer(newRenderer),Android不喜欢并抛出IllegalStateException,说"已经调用了setRenderer". .
现在,我知道这是因为渲染器附加到GLSurfaceView,我需要将此渲染器解除绑定到表面视图,因此我可以再次调用setRenderer.
有人有解决方案吗?
PS:代码如下:
render = new Renderer(this);
setContentView(R.layout.main);
graphicView = (GLSurfaceView) this.findViewById(R.id.graphicView);
//DO STUFF
graphicView.setRenderer(render);
//DO STUFF
Renderer newRender = new Renderer();
graphicView.setRenderer(newRender); <= ...and Android hates this line sooo much
Run Code Online (Sandbox Code Playgroud)
谢谢 !
在这里找到答案,这个"LemonDev"确实拯救了我的生命:
可以停止/销毁OpenGL表面视图,并通过调用OnPause()将新的GLSurfaceView设置为新的渲染器,并使用Handler和Runnable postDelayed destroy,如下所示:
final Renderer newRender = new GRenderer(this);
final LinearLayout ll = (LinearLayout) this.findViewById(R.id.main);
graphicView.onPause();
Handler handler = new Handler();
class RefreshRunnable implements Runnable{
public RefreshRunnable(){
}
public void run(){
ll.removeView(findViewById(R.id.graphicView));
GLSurfaceView surfaceview = new GLSurfaceView(getApplication());
surfaceview.setId(R.id.graphicView);
surfaceview.setRenderer(newRender);
ll.addView(surfaceview);
graphicView = (GLSurfaceView) findViewById(R.id.graphicView);
}
};
RefreshRunnable r = new RefreshRunnable(this);
handler.postDelayed(r, 500);
Run Code Online (Sandbox Code Playgroud)
这将创建一个新的渲染器并暂停GLSurfaceView.然后应用程序将"销毁"一些你无法用SDK接触的内部东西......之后,你可以销毁GLSurfaceView,创建另一个并为其设置新的渲染器.
我现在的问题是纹理还没有刷新,但是,这仍然很棒!
归档时间: |
|
查看次数: |
10806 次 |
最近记录: |