5

OpenGLビューの上にレイヤー化された追加のビューを持つAndroid用のシンプルな3-Dアプリを作成しようとしています(APIデモのSurfaceViewOverlayの例によく似ています)。拡張された GLSurfaceView クラスを使用してそのメソッドを実装しようとすると、問題が発生します。このデモと API Oerlay デモを組み合わせて実行しようとしている例を設定しました。このように Martin の VortexView オブジェクトにキャストしようとすると (API デモの 44 ~ 46 行を置き換えます)

VortexView glSurfaceView=
     (VortexView) findViewById(R.id.glsurfaceview);

ClassCastException エラーが発生するので (キャストはかなり具体的であると想定しているため、理解できます)、ビューを GLSurfaceView インスタンスから新しいサブクラスに転送する方法、またはレンダリング サーフェスを作成後のサブクラスの XML 定義ビュー。

編集:これを機能させるためにいくつかの進歩を遂げました-ビューXMLが使用するAPIの例(ApiDemos/res/layout/surface_view_overlay.xmlから)

        <android.opengl.GLSurfaceView android:id="@+id/glsurfaceview"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

その要素を
com.domain.project.VortexView に変更すると、上記のコードでキャストが正しく行われますが、surfaceCreated および surfaceChanged ルーチンにヒットすると Null Pointer Exceptions が生成されます (これは、GLThread クラスに基づいて呼び出されたメソッドだと思います)。行番号) GLSurfaceView クラス内。したがって、質問を変更する必要があるかもしれません- surfaceCreated および surfaceChanged で NullPointerExceptions を生成せずに GLSurfaceView の拡張機能を実装するにはどうすればよいですか、または GLSurfaceView.java のソースがなくてもそれらをデバッグするにはどうすればよいですか?

4

1 に答える 1

1

これが私がそれを機能させる方法です:

XMLファイル(私のものはmain.xml)で、拡張クラス仕様を使用します

        <com.domain.project.VortexView android:id="@+id/vortexview"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" />

あなたの活動クラスで:

    setContentView(R.layout.main);
    VortexRenderer _renderer=new VortexRenderer();         // setup our renderer
    VortexView glSurface=(VortexView) findViewById(R.id.vortexview); // use the xml to set the view
   glSurface.setRenderer(_renderer); // MUST BE RIGHT HERE, NOT in the class definition, not after any other calls (see GLSurfaceView.java for related notes)
   glSurface.showRenderer(_renderer); // allows us to access the renderer instance for touch events, etc

ビュー定義 (VortexView.java):

public class VortexView extends GLSurfaceView {
    public VortexRenderer _renderer; // just a placeholder for now

public VortexView(Context context) { // default constructor
    super(context);
}


public VortexView(Context context, AttributeSet attrs) { /*IMPORTANT - this is the constructor that is used when you send your view ID in the main activity */
    super(context, attrs);
}

public void showRenderer(VortexRenderer renderer){ // sets our local object to the one created in the main activity, a poor man's getRenderer
    this._renderer=renderer;        
}

public boolean onTouchEvent(final MotionEvent event) { // An example touchevent from the vortex demo
    queueEvent(new Runnable() {
        public void run() {
           _renderer.setColor(event.getX() / getWidth(), event.getY() / getHeight(), 1.0f);
        }
    });
    return true;
}

}

VortexRenderer.java には、典型的な onSurfaceXXXXX 呼び出しがあります。

とにかく、これにより、拡張されたGLSurfaceに他のXML定義ビューをスタックできるようになりました。これは、私が最初に望んでいたものです。

乾杯!

于 2010-07-31T21:39:32.850 に答える