タッチパネル入力 その12013/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側の処理は、また次回に。