『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」でクリアしないと面白いものがでるんだ…。
ってのを知った。(笑)
…
取り敢えず、これで野望に一歩近づいたかも…
遠のいたかも…。(汗)
| 固定リンク
コメント