Hatena::ブログ(Diary)

iAndrolog

2010-05-23

タッチイベント処理(onTouchEvent, SimpleOnGestureListenerの使い方)

Androidタッチパネルで各種操作を行うので、タッチイベントの処理が重要になります。

特にゲームを作る場合など、自前でタッチイベント動作を実装する場合は、onTouchEventやSimpleOnGestureListenerなどを使うことになると思います。

onTouchEventは、「画面タッチ」「移動」「タッチ解除(離す)」などのイベントごとに呼ばれるため、基本的な動作はここで処理することができます。

また、SimpleOnGestureListenerは「ダブルタップ」や「ロングプレス(長押し)」、「フリック」などを自動的に判断してくれるので、もう少し複雑なタッチイベント処理を行うことができます。

onTouchEventを使ったイベント処理(簡単なタッチイベント処理)

public class TouchTestActivity extends Activity {

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

	}

	//簡単なタッチイベント処理
	@Override
	public boolean onTouchEvent(MotionEvent event) {
		switch ( event.getAction() ) {

		case MotionEvent.ACTION_DOWN:
			//画面がタッチされたときの動作
			break;

		case MotionEvent.ACTION_MOVE:
			//タッチしたまま移動したときの動作
			break;

		case MotionEvent.ACTION_UP:
			//タッチが離されたときの動作
			break;

		case MotionEvent.ACTION_CANCEL:
			//他の要因によってタッチがキャンセルされたときの動作
			break;

	    	}

		return super.onTouchEvent(event); 
	}

}

SimpleOnGestureListenerを使ったイベント処理(複雑なタッチイベント処理)

public class TouchTestActivity extends Activity {

	private GestureDetector m_clGestureDetector; 

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		m_clGestureDetector = new GestureDetector(this, simpleOnGestureListener); 
	}

	//簡単なタッチイベント処理
	@Override
	public boolean onTouchEvent(MotionEvent event) {
		switch ( event.getAction() ) {

		case MotionEvent.ACTION_DOWN:
			//画面がタッチされたときの動作
			break;

		case MotionEvent.ACTION_MOVE:
			//タッチしたまま移動したときの動作
			break;

		case MotionEvent.ACTION_UP:
			//タッチが離されたときの動作
			break;

		case MotionEvent.ACTION_CANCEL:
			//他の要因によってタッチがキャンセルされたときの動作
			break;

	    	}

		return super.onTouchEvent(event); 
		return m_clGestureDetector.onTouchEvent(event); 
	}

	//複雑なタッチイベント処理
	private final SimpleOnGestureListener simpleOnGestureListener = new SimpleOnGestureListener() { 

		@Override 
		public boolean onDoubleTap(MotionEvent event) { 

			return super.onDoubleTap(event); 
		} 

		@Override 
		public boolean onDoubleTapEvent(MotionEvent event) { 

			return super.onDoubleTapEvent(event); 
		} 

		@Override 
		public boolean onDown(MotionEvent event) { 

			return super.onDown(event); 
		} 

		@Override 
		public boolean onFling(MotionEvent event1, MotionEvent event2, float velocityX, float velocityY) { 

			return super.onFling(event1, event2, velocityX, velocityY); 
		} 

		@Override 
		public void onLongPress(MotionEvent event) { 

			super.onLongPress(event); 
		} 

		@Override 
		public boolean onScroll(MotionEvent event1, MotionEvent event2, float distanceX, float distanceY) { 

			return super.onScroll(event1, event2, distanceX, distanceY); 
		} 

		@Override 
		public void onShowPress(MotionEvent event) { 

			super.onShowPress(event); 
		} 

		@Override 
		public boolean onSingleTapConfirmed(MotionEvent event) { 

			return super.onSingleTapConfirmed(event); 
		} 

		@Override 
		public boolean onSingleTapUp(MotionEvent event) { 

			return super.onSingleTapUp(event); 
		} 

	}; 

}


それぞれの関数が呼ばれるタイミングは、以下に情報がありました。

GestureDetector.OnDoubleTapListener, GestureDetector.OnGestureListener - earlyharvestの日記


ちょい押し

     onDown -> onShowPress -> onSIngleTapUp -> onSingleTapConfirmed


長押し

     onDown -> onShowPress -> onLongPress


おす→ドラッグ→普通に離す

     onDown -> onShowPress -> onScroll *n


おす→ドラッグ→ぱっと離す(フリック)

     onDown -> onShowPress -> onScroll *n -> onFling


ダブルタップ

     onDown -> onShowPress -> onSingleTapUp -> onDoubleTap -> onDoubleTapEvent


とくめいとくめい 2016/06/30 16:25 return m_clGestureDetector.onTouchEvent(event); …?
の前に
return があるので、?の所に処理は流れないですよね?

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証