タッチパネル入力 その1 ― 2013/11/16
画面への出力がひと通り落ち着いたので、次はタッチパネルからの入力を行います。
タッチパネルの入力情報は java側で受け取ります。
まず一番上にあるビューに通知され、そこでスルーされると次のビュー、最後にはアクティビティに通知されるようになっています。
ここでは一つだけのビュー、サーフェスビューで処理します。
また、せっかくなのでマルチタッチに対応してみます。
BaseActivity.java
サーフェスビュー BaseView内
画面をタッチする、離す等のタッチイベントが起こると onTouchEventが呼ばれます。
Android SDKでダブルタップ等の動作を判定することもできるのですが、ここでは
・画面を押しているか
・押している場合、その位置
だけを取得して、後の処理は native側に任せることとします。
取得した状態は、どのみち nativeはフレーム単位で動いているのでイベントが起きる度ではなく、updateNativeのタイミングで送るようにします。
レンダラー BaseRenderer内
最新の状態だけを送るので、炎のコマで秒間200万回入力しても無視されます。
native側の処理は、また次回に。
タッチパネルの入力情報は java側で受け取ります。
まず一番上にあるビューに通知され、そこでスルーされると次のビュー、最後にはアクティビティに通知されるようになっています。
ここでは一つだけのビュー、サーフェスビューで処理します。
また、せっかくなのでマルチタッチに対応してみます。
BaseActivity.java
private short[] touch_status = new short[5*3]; // タッチパネル状態
サーフェスビュー BaseView内
/******************** タッチイベント ********************/ public boolean onTouchEvent(final MotionEvent event) { if ( future == null ) { return false; } int _action = event.getAction(); int _index, _id; switch ( _action & MotionEvent.ACTION_MASK ) { case MotionEvent.ACTION_DOWN : case MotionEvent.ACTION_POINTER_DOWN : _index = (_action & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT; _id = event.getPointerId(_index)*3; touch_status[_id + 1] = (short)event.getX(_index); // X座標 touch_status[_id + 2] = (short)event.getY(_index); // Y座標 touch_status[_id + 0] = 1; // タッチ中 break; case MotionEvent.ACTION_MOVE : for (_index = 0; _index < event.getPointerCount(); _index++) { _id = event.getPointerId(_index)*3; touch_status[_id + 1] = (short)event.getX(_index); // X座標 touch_status[_id + 2] = (short)event.getY(_index); // Y座標 touch_status[_id + 0] = 1; // タッチ中 } break; case MotionEvent.ACTION_UP : case MotionEvent.ACTION_POINTER_UP : _index = (_action & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT; _id = event.getPointerId(_index)*3; touch_status[_id + 0] = 0; // 非タッチ break; } return true; }
画面をタッチする、離す等のタッチイベントが起こると onTouchEventが呼ばれます。
Android SDKでダブルタップ等の動作を判定することもできるのですが、ここでは
・画面を押しているか
・押している場合、その位置
だけを取得して、後の処理は native側に任せることとします。
取得した状態は、どのみち nativeはフレーム単位で動いているのでイベントが起きる度ではなく、updateNativeのタイミングで送るようにします。
レンダラー BaseRenderer内
public void onDrawFrame(GL10 gl) { synchronized (renderer) { if ( (future != null) && !updateNative(touch_status) ) { // native部稼働 finish(); } } }
最新の状態だけを送るので、炎のコマで秒間200万回入力しても無視されます。
native側の処理は、また次回に。
最近のコメント