My Photo

« 第24節、新潟完封負け、磐田は大宮に今期ホーム初勝利を献上 | Main | なんとか勝ったW杯3次予選日本vs北朝鮮 »

August 30, 2011

Androidアプリ開発メモ015:タッチイベント

タッチイベントの処理

Activity または View の onTouchEvent() をオーバーライドしてタッチイベントの処理を行う。
View では上位の View の onTouchEvent() から順に呼ばれる。
Activity では View でタッチイベントが消費されなかった場合に呼ばれる。

onTouchEvent() はtrueを返すとイベントを消費したとみなされて他のコンポーネントにイベントは伝わらない。つまりそのイベントの処理はそのonTouchEvent()で終わりということになる。
falseを返すとほかのコンポーネントにもイベントは通知される。

ActivityとViewの両方でonTouchEvent()を下記のようにオーバーライドして実験した。
Activityの方はsuper.onTouchEvent()に委譲し、View#onTouchEvent() は true または false を返すようにハードコーディングした。
エミュレータでマウスをドラッグした場合の動きを、Viewの方の戻り値を変えて比較した。

View#onTouchEvent() が true を返す場合
View は DOWN、UP、MOVE のイベントを拾った。
Activity にはイベントが伝わらない。
View#onTouchEvent() が false を返す場合
View では DOWN イベントしか拾えなかった。
Activity は DOWN、UP、MOVE のイベントを拾った。
public boolean onTouchEvent(MotionEvent event) {
	// アクション種別とタッチ数の取得
	int action = event.getAction();
	int count = event.getPointerCount();
	
	// アクションインデックスとポインタIDの取得
	int index
		= (action & MotionEvent.ACTION_POINTER_ID_MASK)
			>> MotionEvent.ACTION_POINTER_ID_SHIFT;	// API LEVEL 5~7
//	int index = event.getActionIndex();	// API LVEL 8(Android 2.2)以降
	int pointerId = event.getPointerId(index);
	
	// タッチ位置の取得
	switch (action & MotionEvent.ACTION_MASK) {
	case MotionEvent.ACTION_DOWN:
	case MotionEvent.ACTION_POINTER_DOWN:
		Log.v("EV", "DOWN actindex:" + index + "  pid:" + pointerId);
		break;
	case MotionEvent.ACTION_UP:
	case MotionEvent.ACTION_POINTER_UP:
		Log.v("EV", "UP actindex:" + index + "  pid:" + pointerId);
		break;
	case MotionEvent.ACTION_MOVE:
		Log.v("EV", "MOVE actindex:" + index + "  pid:" + pointerId);
		break;
	default:
		Log.v("EV", "action=" + action + " actindex:" + index + "  pid:" + pointerId);
	}
	return true;
//	return false;
//	return super.onTouchEvent(event);	// Activityの方では元のonTouchEvent()を呼ぶ
}

MotionEvent

ポインタIDを得るにはアクションインデックスというものが必要。
本に
「アクションインデックスは「タッチ数-1」以下の整数で、同じ指でもタッチ数が変わると値が変わる可能性がある。」
とあったが?同じ指って同じタッチということ?システムがどの指かなんて識別できるないと思うのだが?。
1箇所タッチしていてさらに2箇所目をタッチした場合、1箇所目のタッチのポインタIDは変わらないがアクションインデックスは変わる可能性があるという意味か?

アクションインデックスを使えばほかにイベントを起こしているのとは別のタッチの位置も取れる。
MotionEventで引数なしのgetX()はそのイベントのX座標、アクションインデックスを引数に取るgetX()はそのアクションインデックスのタッチのX座標。

エミュレータで1箇所タッチした場合、アクションインデックスもポインタIDも0だった。

参考ページ:Androidでアプリ画面のタッチイベントを取得する方法 | Tech Booster

« 第24節、新潟完封負け、磐田は大宮に今期ホーム初勝利を献上 | Main | なんとか勝ったW杯3次予選日本vs北朝鮮 »

Androidアプリ開発」カテゴリの記事

Comments

Post a comment

(Not displayed with comment.)

TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/26461/52608353

Listed below are links to weblogs that reference Androidアプリ開発メモ015:タッチイベント:

« 第24節、新潟完封負け、磐田は大宮に今期ホーム初勝利を献上 | Main | なんとか勝ったW杯3次予選日本vs北朝鮮 »

March 2017
Sun Mon Tue Wed Thu Fri Sat
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
無料ブログはココログ

日本blog村

  • にほんブログ村 IT技術ブログへ
  • にほんブログ村 アニメブログへ
  • にほんブログ村 サッカーブログ アルビレックス新潟へ

好きな音楽家

メモ

XI-Prof