2016-12-29 4 views
0

アンドロイドで回転球の例をgiven hereとしました。回転する球(地球)を示す簡単なアプリケーションを作成します。アンドロイドのGLSurfaceViewインスタンスでレンダリングを交換するにはどうすればいいですか?

GLSurfaceViewから派生したクラスでは、レンダラーを交換するために偶数(タッチスクリーンイベントのような)を待っています。現在のレンダラーがレンダリングを停止し、GLSurfaceViewが(別のオブジェクトを表示するために)別のレンダラーを使用する必要があります。

私は次のコードを使用しようとしました:私は停止/削除/「古い」レンダラを破壊しなければならないと思い

FATAL EXCEPTION: main 
Process: com.jimscosmos.opengltexturedsphere, PID: 25708 
java.lang.IllegalStateException: setRenderer has already been called for this instance. 

、しかし:

public class MyGLSurfaceView extends GLSurfaceView { 

    Context mycontext; 

    MyGLSurfaceView(Context context) { 
     super(context); 
     mycontext = context; 
    } 

    public boolean onTouchEvent(MotionEvent event) { 
     int x = (int)event.getX(); 
     int y = (int)event.getY(); 
     Log.d("onTouchEvent",String.format("keyCode: %d coords: %d %d", event.getActionMasked(), x, y)); 

     GlRenderer renderer = new GlRenderer(mycontext); 
     setRenderer(renderer); 
     return super.onTouchEvent(event); 
    } 
} 

次のエラーを与えます私はそれのために有用な何かを見つけませんでしたin the documentation。多分私のアプローチは完全に間違っていますか?もう何をすべきか?どのようにそれを正しく行うには?

+0

いいえ、レンダラーを停止して変更しないでください。なぜ同じレンダラーでオブジェクトを交換しないのですか? – MarGenDo

+0

'GLSurfaceView'の中からこれを行う方法は?多分あなたは例を参照することができますか? – Alex

+0

いいえ、 'onDrawFrame'関数でレンダラーから変更してください。例: 'if(something){drawSphere1();} else {drawSphere2();}' – MarGenDo

答えて

0

あなたが主張するのであれば、技術的には「メディエーター」を使って達成することができます - ここに示唆されているように:Change GlSurfaceView renderer

しかし、これはあなたが本当に必要としないオーバーヘッドだと思います。さまざまなオブジェクトを準備し、単一のレンダラーでさまざまなレンダリングプロパティを変更するだけです。

+0

これを行う方法のいくつかの例を教えてください。 – Alex

+0

私は必要性を見ません - それはあなたの具体的な実装に依存します。あなたのレンダラはあなたが望む何らかのタスクを処理し、あなたが望むものに応じてタスクを切り替えることができるはずです(当初はレンダラを変更しようと思ったのと同じ条件で) – yakobom

関連する問題