タッチパネル入力 その1
2013-11-16


画面への出力がひと通り落ち着いたので、次はタッチパネルからの入力を行います。

タッチパネルの入力情報は 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側の処理は、また次回に。
[Android プログラミング]

コメント(全0件)
コメントをする


記事を書く
powered by ASAHIネット