GLSurfaceView と GLSurfaceView.Renderer で作成したクラスでのイベント発生順序について

108 views
Skip to first unread message

Kirita Kazuya

unread,
Jun 23, 2011, 4:28:37 AM6/23/11
to android-g...@googlegroups.com
はじめまして。かじきといいます。
いつもMLを参考にさせていただいています。

さっそくですが、今自分が公開しているアプリで、1件のエラー報告がありました。

public class MyGLSurfaceView extends GLSurfaceView implements
GLSurfaceView.Renderer {
...
// 内部ゲーム画面サイズ(デバイスによらず一定)
private static final int GAME_SCREEN_WIDTH =240;
private static final int GAME_SCREEN_HEIGHT = 320;

// 実際の画面サイズ(デバイスにより異なる)
private int mGLWidth = 0;
private int mGLHeight = 0;
...
@override
public void onSurfaceChanged(GL10 gl, int width, int height) {
...
// 画面のサイズを更新
mGLWidth = width;
mGLHeight = height;
...
// アスペクト比を保ち、かつ画面に収まる最大のサイズになるようにViewPortを設定
mGLViewPortRect = ....;
}

@Override
public boolean onTouchEvent(final MotionEvent e) {
...
// GLSurfaceView上での座標を、内部のゲーム画面への座標に変換する
int xPos = GAME_SCREEN_WIDTH * (e.getX() - mGLViewPortRect.left) / mGLWidth;
int yPos = GAME_SCREEN_HEIGHT * (e.getY() - mGLViewPortRect.top) / mGLHeight;
...
}
}


という定義のクラスで、onTouchEvent 内でゼロによる除算エラーが発生していました。
となると mGLWidth もしくは mGLHeight がゼロになっている、ということになります。
mGLWidth, mGLHeight に代入しているのは宣言時、および onSurfaceChanged 内だけです。
そこで質問なのですが、

1) onSurafeChanged で width や height 引数の値が 0 になることがありうるのでしょうか?
2) onSurafeChanged よりも先に onTouchEvent が呼ばれることがありうるのでしょうか?

ご存知の方がいましたら教えていただけるとうれしいです。単にエラーをふさぐだけなら
private int mGLWidth = 0;
private int mGLHegiht = 0;
ではなくて
private int mGLWidth = GAME_SCREEN_WIDTH;
private int mGLHeight = GAME_SCREEN_HEIGHT;
と、適当なデフォルト初期値を入れておけばいいのですが、ちょっと気になったもので。

--
かじき
dovei...@gmail.com

t.shinsay

unread,
Jun 23, 2011, 9:20:11 AM6/23/11
to 日本Androidの会
tshinsayです。

前者の状況は確認したことはありませんが、後者は十分に考えられます。
GLSurfaceView.Rendererのメソッドは、ご存知かと思われますがUIスレッドと別スレッドで動作しますので、
EGLによる初期化が行われる前にUIスレッドによってonTouchEventが呼び出される可能性は否定できません。


---
Blog始めてみました
http://shinsay-labo.blogspot.com/

Kirita Kazuya

unread,
Jun 23, 2011, 10:33:39 PM6/23/11
to android-g...@googlegroups.com
tshinsayさま
ご返答どうもありがとうございます。

なるほど、この場合はイベントの発生順序に依存するコードを書かない方がよさそうですね。
適当な値で初期化しておくことにします。
ありがとうございました!

Reply all
Reply to author
Forward
0 new messages