2012年06月20日

複雑なタッチイベントを制御する


タッチパネルを操作するとTouch Eventが発生し
"Touch Down"・"move"・ "Touch Up"などがよばれるため
基本的な動作はここで処理することができます
タッチイベントを取得する
"ダブルタップ", "ロングタップ", "フリック"など少し複雑なタッチイベントを処理するには
SimpleOnGestureListenerを使います

複雑なタッチイベントを取得
実際のタッチイベントの取得方法ですが
まずはGestureDetectorを生成します
これはActivity内で構いません

次にonTouchEventを作成しタッチイベントを検出させます
そしてonTouchEventが発生するとGestureDetectorが発生するようにします

最後にあらかじめonGestureListenerを作っておき
onTouchEventが発生するとonGestureListener内で複雑なタッチイベントを検出します

言葉で書くと少し複雑ですがonTouchEventでは複雑なタッチイベントを特定できないため
onGestureListenerで判別するという方法です
実際のプログラムは以下のようになります
それぞれのタッチ動作の後にログを出力するようにしています

MainActivity.java
package blog.test;
 

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

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

		// GestureDetecotorのインスタンス生成
		gesDetect = new GestureDetector(this, onGestureListener);
	}

@Override
	public boolean onTouchEvent(MotionEvent event) {
	// タッチイベントが発生するとGestureDetectorが発生
	gesDetect.onTouchEvent(event);
	return false;
	}

	// 複雑なタッチイベントを取得
	private final SimpleOnGestureListener onGestureListener = new SimpleOnGestureListener() {
		@Override
		public boolean onDoubleTap(MotionEvent e) {
			Log.i("tag", "onDoubleTap");
			return super.onDoubleTap(e);
		}
		
		@Override
		public boolean onDoubleTapEvent(MotionEvent e) {
			Log.i("tag", "onDoubleTapEvent");
			return super.onDoubleTapEvent(e);
		}
		
		@Override
		public boolean onDown(MotionEvent e) {
			Log.i("tag", "onDown");
			return super.onDown(e);
		}

		@Override
		public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) {
			Log.i("tag", "onFling");
			return super.onFling(e1, e2, velocityX, velocityY);
		}
		
		@Override
		public void onLongPress(MotionEvent e) {
			Log.i("tag", "onLongPress");
			super.onLongPress(e);
		}
		
		@Override
		public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
			Log.i("tag", "onScroll");
			return super.onScroll(e1, e2, distanceX, distanceY);
		}
		
		@Override
		public void onShowPress(MotionEvent e) {
			Log.i("tag", "onShowPress");
			super.onShowPress(e);
		}
		
		@Override
		public boolean onSingleTapConfirmed(MotionEvent e) {
			Log.i("tag", "onSingleTapConfirmed");
			return super.onSingleTapConfirmed(e);
		}
		
		@Override
		public boolean onSingleTapUp(MotionEvent e) {
			Log.i("tag", "onSingleTapUp");
			return super.onSingleTapUp(e);
		}
	};
}

イベント発生順番
実際に実行してみてログを確認すると次々とログが出力されています
device128.png

各タッチイベントごとの発生順番は以下の通りとなっています
・シングルタップ
onDown → onShowPress → onSingleTapUp → onSingleTapConfirmed

・ロングタップ
onDown → onShowPress -> onLongPress

・ダブルタップ
onDown → onSingleTapUp → onDoubleTap → onDoubleTapEvent
 → onDown → onDoubleTapEvent

・スクロール
onDown → onScroll * n

・フリック
onDown → onScroll * n → onFling
スポンサードリンク

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

メールアドレス:

ホームページアドレス:

コメント:

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


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

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

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