6

Android OpenGLアプリケーションを起動し、次のクラスがあります。

class A extends Activity
class B extends GlSurfaceView implements Renderer

クラスAのonCreateが呼び出されると、クラスBタイプのオブジェクトが作成され、次のように呼び出されます。

setContentView(Bobject)

これまでのところそれは機能し、私はそれに数日を費やしました。

ここで、アプリケーションにボタンを追加したいと思い、SurfaceViewOverlayの例を見つけました。これは、いくつかのXMLを使用してビュー階層を作成します。XMLコードを切り取って貼り付けるのと非常によく似たものを作成したかったのです。

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

    <LinearLayout android:id="@+id/hidecontainer"
            android:orientation="vertical"
            android:visibility="gone"
            android:background="@drawable/translucent_background"
            android:gravity="center"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
            ...

元のクラス階層を念頭に置いて、ビューを初期化するにはどうすればよいですか?クラスAのonCreate()に何を書くべきですか?

私は使ってみました:

Bobject = new B(this);
GLSurfaceView glSurfaceView =
        (GLSurfaceView) findViewById(R.id.glsurfaceview);
    glSurfaceView.setRenderer(Bobject);

また、ボタンとGLビューを画面に描画しますが、GLビューはタップ/クリックからの入力を取り込むことができません。

これは、BobjectのonTouchEvent()が次のようにのみ使用されているため、呼び出されていないことが原因である可能性があります。

Renderer

ではなく:

glSurfaceView

物体。

上記のコードの代わりに、私が本当に望んでいるのは、BobjectでglSurfaceViewを置き換えることです。しかし、私はそれを行う方法がわかりません。findViewById()を実行すると、glSurfaceViewは今のところすでに作成されているようです。GLビューにタイプBのオブジェクトを使用するように依頼するにはどうすればよいですか?

初心者のミスについては申し訳ありません。Androidはまったく新しい。

編集:私もこれを試しました:

また、次のことも試しました。XMLファイルで、GLSurfaceViewを次のように変更しました。

<com.bla.bla.B
            android:id="@+id/glsurfaceview"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

そして、私のAクラスコンストラクターでは、次のように呼び出しています。

// This returns null
Bobject = (B) findViewById(R.id.glsurfaceview);

// And this suspends the application. :(
setContentView(R.layout.surface_view_overlay);

XMLファイル/アクティビティでglSurfaceViewを拡張するカスタムクラスをどのように使用する必要がありますか?

4

2 に答える 2

7

さて、これを行う適切な方法は、以下を取り込むBクラスのコンストラクターを持つことです。

B(Context context, AttributeSet attrs)
{
  super(context, attrs);
}

そして、XMLレイアウトでは、これを使用します。

<com.bla.bla.B
        android:id="@+id/glsurfaceview"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

私のコードに欠けていたのはコンストラクターの署名でした。

于 2010-11-08T06:16:08.180 に答える
1

これを解決する別の方法は、ビューをアクティビティAにアタッチしたままにすることです。したがって、setContentView(Bオブジェクト)を使用する代わりに、setContentView(Aオブジェクト)を使用し、「AXML」ファイル内にGLsurfaceViewビューがあります。

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

次に、アクティビティAでBオブジェクトを参照できます。これは、ContentViewをBではなくAに設定したときに膨らんだためです。

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


glSurfaceView.setRenderer();  //no longer have to pass the object

正直なところ、希望どおりに機能させる方法はわかりませんが、あなたの場合、最終的に違いが生じるかどうかはわかりません。繰り返しになりますが、私もまだ初心者です。今日同様の質問をしたので、これを別の方法で行う方法を学びたいと思います。

于 2010-11-08T01:48:31.350 に答える