« 『喫茶室ルノアール』で待ち合わせ。 | トップページ | 『第44回三鷹阿波おどり』を見てきた♪ »

2011年8月21日 (日)

『Android』の『OpenGL』で弄ばれられる…

『OpenGL』上にメニューを表示したい。

と考えて色々居調べてやってみる。

最初は、これからスタート。

public void onCreate(Bundle savedInstanceState) {
    ...
    gLSurfaceView = new GLSurfaceView(this);
    gLSurfaceView.setRenderer(new Renderer());
    setContentView(gLSurfaceView);

    Viwe button = View.inflate(this, R.layout.button, null);
    addContentView(button, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
    ...
}

さらに進行によってテキストビュアーなどを表示したい。

つまるところ…

レイアウトを任意に切り替えたい!

で、最初にこんなのを考えてみた。
引数は、初期化で設定し、その後は使い回すとする。
毎回「new」だとメモリーにも速度にも優しくないので…。

void selectLayout(int mode) {
    switch(mode) {
    case inital:
        setContentView(gLSurfaceView);
        addContentView(button, new LayoutParams(...省略...));
        break;
    case title:
        setContentView(R.layout.title);
        addContentView(button, new LayoutParams(...省略...));
        break;
    case play:
        ...
    }
}

「layout」だけなら上記で成立するのだが…
「OpenGL」の「setContentView(surfaceView);」だと
一回目は、正常に動作するが、
2回目以降は、「onDrawFrame」が呼び出されなくなる…。

つまり、何も表示されない。(汗)

端末を傾けて「onCreate」を実行すると
再び一回だけ正常に動作するが…。

何じゃこりゃ…?

「setContentView」が実行されると
「gLSurfaceView.setRenderer」の中身が壊れるのか?

謎だ…。

なので今度は、こうしてみる…

    case inital:
        gLSurfaceView.setRenderer(new Renderer());
        setContentView(gLSurfaceView);
        addContentView(button, new LayoutParams(...省略...));
        break;

「gLSurfaceView.setRenderer(new Renderer());」が
1回目が正常だが、2回目でハング。(T_T)

この使い方は、駄目らしい。
「OpenGL」は、ある種異質なものなので
そういうこともあるだろう…。

と言う事にする!

そんな訳で、やり方変更…。

初期化で一通り登録する。

public void onCreate(Bundle savedInstanceState) {
...
setContentView(gLSurfaceView);
...
addContentView(layoutMain, ...);
...
addContentView(layoutButton, ...);
...
addContentView(layoutMessage, ...);
...
}

その後、表示・非表示を行う形にしてみた。

public void setScreenContent() {
...
layoutMain.setVisibility(flagMain ? View.VISIBLE : View.INVISIBLE);
layoutButton.setVisibility(flagButton ? View.VISIBLE : View.INVISIBLE);
layoutMessage.setVisibility(flagMessage ? View.VISIBLE : View.INVISIBLE);
...
}

これは、上手くいった。

この形で、処理を作っていってみよう!

ちなみに「OpenGL」の下にレイアウトを
配置したら挟めるかな?
そしたら自由度が格段に上がる。

public void onCreate(Bundle savedInstanceState) {
...
setContentView(layoutColorR);
...
addContentView(gLSurfaceView, ...);
...
addContentView(layoutMain, ...);
...
addContentView(layoutButton, ...);
...
addContentView(layoutMessage, ...);
...
}

だが、レンダラーが不透明なために下のレイアウトは、表示されない。

「glClear」をコメントアウトしても駄目。
でも、「glClear」でクリアしないと面白いものがでるんだ…。
ってのを知った。(笑)

取り敢えず、これで野望に一歩近づいたかも…

遠のいたかも…。(汗)

|

« 『喫茶室ルノアール』で待ち合わせ。 | トップページ | 『第44回三鷹阿波おどり』を見てきた♪ »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: 『Android』の『OpenGL』で弄ばれられる…:

« 『喫茶室ルノアール』で待ち合わせ。 | トップページ | 『第44回三鷹阿波おどり』を見てきた♪ »