2012年07月10日

マルチタッチイベントを取得する


今回はタッチの応用系マルチタッチイベントです
マルチタッチとはその名の通り2点以上を同時にタッチしたものを検出することです
Androidでは 2.0(API 5)以降でマルチタッチがサポートされ使用可能です

それぞれの発生イベント一覧
ACTION_DOWN: タッチパネルがまだタッチされていない状態で、タッチパネルを押した場合
ACTION_MOVE: タッチパネルを押したままスライドさせた場合
ACTION_POINTER_DOWN: タッチパネルの一箇所以上をタッチしている状態で、さらにタッチパネルを押した場合
ACTION_POINTER_UP: タッチパネルの二箇所以上をタッチしている状態で、うち一箇所を離した場合
ACTION_UP: タッチパネルがまだタッチされていない状態で、タッチパネルから指を持ち上げた場合

つまり複数の指でタッチパネルを操作するとタッチイベント(Touch Event)が
1点目タッチ:ACTION_DOWN
2点目タッチ:ACTION_POINTER_DOWN
ACTION_MOVE(繰返し)→
2点目離し:ACTION_POINTER_UP
1点目離し:ACTION_UP
の順に発生します

イベントをアクティビティで取得する
複数タッチイベントもアクティビティ内で取得する方法と
View内で取得する方法の2種類があります

今回はアクティビティ内で取得します
基本的にはアクティビティ内でTouchEventを取得するものの応用編となります
主な項目のみ挙げると
まずonTouchEventを作成します

getActionでどのようなタッチアクションをしたかの情報を取得します
getPointerCounではタッチ数を取得します

そしてタッチアクション情報をMotionEvent.ACTION_POINTER_ID_MASKでマスクして
MotionEvent.ACTION_POINTER_ID_SHIFT分シフトすることで
ポインタIDを取得するためのインデックスを取得しています
“>>”の記号はビット操作演算子と言われていて
ビット列を右や左にシフトします

getX・getYではタッチされたx・y座標を取得しています


今回はそれぞれのアクションイベントとポイント座標をログとして出力しています
MainActivity.java
package blog.test;
 


import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;

public class MainActivity extends Activity {
	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
	}

	@Override
	public boolean onTouchEvent(MotionEvent event) {
		//タッチアクションの情報を取得
		int action = event.getAction();
		//タッチ数を取得
		int count = event.getPointerCount();
		
		int id = (action & MotionEvent.ACTION_POINTER_ID_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT;
		
		//イベントごとにログを出力
		switch(action & MotionEvent.ACTION_MASK) {
		case MotionEvent.ACTION_DOWN:
			Log.i("tag", "Touch Down" + " count=" + count + ", id=" + id);
			break;
		case MotionEvent.ACTION_POINTER_DOWN:
			Log.i("tag", "Touch PTR Down" + " count=" + count + ", id=" + id);
			break;
		case MotionEvent.ACTION_UP:
			Log.i("tag", "Touch Up" + " count=" + count + ", id=" + id);
			break;
		case MotionEvent.ACTION_POINTER_UP:
			Log.i("tag", "Touch PTR Up" + " count=" + count + ", id=" + id);
			break;
		case MotionEvent.ACTION_MOVE:
			Log.i("tag", "Touch Move" + " count=" + count + ", id=" + id);
			break;
		}
		
		for(int i=0; i<count; i++) {
			Log.i("tag", " X=" + event.getX(i) + ", Y=" + event.getY(i) + ", id=" + event.getPointerId(i) );
		}
		return super.onTouchEvent(event);
	}
}

今回は実機のgalaxy sで実行してみました


いろいろタッチしてみるとマルチタッチにより次々にログが検出されているのがわかります
device129.png
スポンサードリンク

posted by kenken at 16:17 | Comment(0) | TrackBack(0) | イベント イベント処理 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。
この記事へのトラックバックURL
http://blog.seesaa.jp/tb/280101239
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。