六章:複雑なタッチ判定を取る

今回は、今まで使ってきたタッチ操作よりもより複雑なタッチ判定を取れる
GestureDetectorについて紹介していこうと思う。

まずは下記のソースを見よう見まねで書いて実行してみよう。
+ ソース
  1. public class MainActivity extends Activity implements GestureDetector.OnGestureListener,
  2. GestureDetector.OnDoubleTapListener{
  3.  
  4. //GestureDetectorインスタンス変数
  5. private GestureDetector gestureDitector;
  6.  
  7. @Override
  8.  protected void onCreate(Bundle savedInstanceState) {
  9.   super.onCreate(savedInstanceState);
  10.   setContentView(R.layout.activity_main);
  11.  
  12.   //GestureDetectorインスタンス生成
  13.   gestureDitector = new GestureDetector(this,this);
  14.  }
  15.  
  16.  //タッチイベント用のメソッドを作る
  17.  public boolean onTouchEvent(MotionEvent event){
  18.   //gestureDitector.onTouchEventメソッドでタッチイベントの判定と振り分けを行う。
  19.   gestureDitector.onTouchEvent(event);
  20.  
  21.  return false;
  22.  }
  23.  
  24.  @Override
  25.  public boolean onDoubleTap(MotionEvent e) {
  26.   Toast.makeText(this, "onDoubleTap", Toast.LENGTH_LONG).show();
  27.   return false;
  28.  }
  29.  
  30.  @Override
  31.  public boolean onDoubleTapEvent(MotionEvent e) {
  32.   Toast.makeText(this, "onDoubleTapEvent", Toast.LENGTH_LONG).show();
  33.   return false;
  34.  }
  35.  
  36.  @Override
  37.  public boolean onSingleTapConfirmed(MotionEvent e) {
  38.   Toast.makeText(this, "onSingleTapConfirmed", Toast.LENGTH_LONG).show();
  39.   return false;
  40.  }
  41.  
  42.  @Override
  43.  public boolean onDown(MotionEvent e) {
  44.   Toast.makeText(this, "onDown", Toast.LENGTH_LONG).show();
  45.   return false;
  46.  }
  47.  
  48.  @Override
  49.  public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
  50.   Toast.makeText(this, "onFling", Toast.LENGTH_LONG).show();
  51.   return false;
  52.  }
  53.  
  54.  @Override
  55.  public void onLongPress(MotionEvent e) {
  56.   Toast.makeText(this, "onLongPress", Toast.LENGTH_LONG).show();
  57.  }
  58.  
  59.  @Override
  60.  public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
  61.   Toast.makeText(this, "onScroll", Toast.LENGTH_LONG).show();
  62.   return false;
  63.  }
  64.  
  65.  @Override
  66.  public void onShowPress(MotionEvent e) {
  67.   Toast.makeText(this, "onShowPress", Toast.LENGTH_LONG).show();
  68.  }
  69.  
  70.  @Override
  71.  public boolean onSingleTapUp(MotionEvent e) {
  72.   Toast.makeText(this, "onSingleTapUp", Toast.LENGTH_LONG).show();
  73.   return false;
  74.  }
  75.  
  76. }
  77.  

+ 簡単な解説
今までimplementsしてきたonTouchListenerではなく、
GestureDetector.OnGestureListenerGestureDetector.OnDoubleTapListener
をimplemantsすることで今までよりも複雑なタッチ判定を取れる。
これをimplemantsしたときに表示されるエラーの中に「実装されていないメソッドを追加」があるので
それを選択することでメソッドが沢山追加される。
この追加されたメソッドは使わなくても必ず実装されていなければならないので注意。

さて、順番に解説していこう。
まず、GestureDetectorのインスタンス変数(インスタンス変数はメンバ変数とだいたい同義)を
onCreateの前で宣言しておく。
そして、onCreate内でGestureDetectorのインスタンス変数に実体を持たせる(インスタンス生成)

次にタッチイベントを捕捉するためのonTouchEventメソッド内で
gestureDitector.onTouchEvent(event)を記述することでGestureDetectorの
イベントを取ることが出来るようになる。

これでGestureDetectorの実装は完了。

+ gestureイベントの簡単な解説
  • onDoubleTap
 素早く二回画面をタップすることで呼ばれる。

  • onDoubleTapEvent
 onDoubleTap中に行われたスクロールなどのイベントで呼ばれる。

  • onSingleTapConfirmed
 一回タップしたときに呼ばれる。

  • onDown
 画面を押したときに呼ばれる。

  • onFling
 フリック(画面を指ではじくようになぞる)したときに呼ばれる。

  • onLongPress
 画面を長押ししたときに呼ばれる。

  • onScroll
 ゆっくり画面をなぞった時に呼ばれる。

  • onShowPress
 画面を押した(すぐに指を離したりなぞったりしない)ときに呼ばれる。

  • onSingleTapUp
 画面をタップしたときに呼ばれる。(ダブルタップ時にも呼ばれる)

+ ちょっとした小話
今回紹介したGestureDetectorは簡単に複雑な処理を取ることが出来るという便利なものなのだが、
使わないものも必ず実装しなければならない=余計な判定もしなければならない。
このため、無駄な処理を行うことになるのでパフォーマンス面で不利になる可能性もある。
なので、使用するタッチイベントが一部だけというアプリケーションの場合にはGestureDetectorに頼らず、
自力で判定などを実装することで処理を軽量化するという方法もある。(慣れてきたらの話だが)
最終更新:2013年08月27日 15:36