出于某种原因,我需要重新启动一个GLSurfaceView.Renderer,所以我想在我的应用程序中第二次调用setRenderer(newRenderer),Android不喜欢并抛出IllegalStateException,说“已经调用了setRenderer” ” ...
现在,我知道这是因为渲染器附加到GLSurfaceView,我需要将此渲染器解除绑定到表面视图,因此我可以再次调用setRenderer。
任何人都有解决方案吗?
P.S .: 代码如下所示:
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
谢谢!
答案 0 :(得分:5)
找到答案here,这个“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);
这将创建一个新的渲染器并暂停GLSurfaceView。然后应用程序将“销毁”一些你无法用SDK接触的内部东西...之后,你可以销毁GLSurfaceView,创建另一个并为其设置新的渲染器。
我现在的问题是纹理还没有刷新,但是,这仍然很棒!
答案 1 :(得分:4)
你真的需要两次调用setRenderer吗?
此方法应在a的生命周期中调用一次且仅调用一次 GLSurfaceView。
相反,我想你想暂停渲染?
使用setRenderMode(RENDERMODE_WHEN_DIRTY);
暂停渲染器
答案 2 :(得分:2)
我发现了一种更简单的刷新纹理的方法。在你的Activity类中调用invalidate()然后在你的表面视图类中你的onDrawFrame将每次都被调用。所以你可以在这里加载你的纹理,从而你的工作将完成!