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

「六章:複雑なタッチ判定を取る」の編集履歴(バックアップ)一覧はこちら

六章:複雑なタッチ判定を取る」(2013/08/27 (火) 15:36:30) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

今回は、今まで使ってきたタッチ操作よりもより複雑なタッチ判定を取れる &bold(){&color(red){GestureDetector}}について紹介していこうと思う。 まずは下記のソースを見よう見まねで書いて実行してみよう。 ↓以下ソース #region(クリックして開く) #highlight(linenumber, java){{ public class MainActivity extends Activity implements GestureDetector.OnGestureListener, GestureDetector.OnDoubleTapListener{ //GestureDetectorインスタンス変数 private GestureDetector gestureDitector; @Override  protected void onCreate(Bundle savedInstanceState) {   super.onCreate(savedInstanceState);   setContentView(R.layout.activity_main);   //GestureDetectorインスタンス生成   gestureDitector = new GestureDetector(this,this);  }  //タッチイベント用のメソッドを作る  public boolean onTouchEvent(MotionEvent event){   //gestureDitector.onTouchEventメソッドでタッチイベントの判定と振り分けを行う。   gestureDitector.onTouchEvent(event);  return false;  }  @Override  public boolean onDoubleTap(MotionEvent e) {   Toast.makeText(this, "onDoubleTap", Toast.LENGTH_LONG).show();   return false;  }  @Override  public boolean onDoubleTapEvent(MotionEvent e) {   Toast.makeText(this, "onDoubleTapEvent", Toast.LENGTH_LONG).show();   return false;  }  @Override  public boolean onSingleTapConfirmed(MotionEvent e) {   Toast.makeText(this, "onSingleTapConfirmed", Toast.LENGTH_LONG).show();   return false;  }  @Override  public boolean onDown(MotionEvent e) {   Toast.makeText(this, "onDown", Toast.LENGTH_LONG).show();   return false;  }  @Override  public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {   Toast.makeText(this, "onFling", Toast.LENGTH_LONG).show();   return false;  }  @Override  public void onLongPress(MotionEvent e) {   Toast.makeText(this, "onLongPress", Toast.LENGTH_LONG).show();  }  @Override  public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {   Toast.makeText(this, "onScroll", Toast.LENGTH_LONG).show();   return false;  }  @Override  public void onShowPress(MotionEvent e) {   Toast.makeText(this, "onShowPress", Toast.LENGTH_LONG).show();  }  @Override  public boolean onSingleTapUp(MotionEvent e) {   Toast.makeText(this, "onSingleTapUp", Toast.LENGTH_LONG).show();   return false;  } } }} #endregion #region(簡単な解説) 今までimplementsしてきたonTouchListenerではなく、 &bold(){GestureDetector.OnGestureListener} と &bold(){GestureDetector.OnDoubleTapListener} をimplemantsすることで今までよりも複雑なタッチ判定を取れる。 これをimplemantsしたときに表示されるエラーの中に「実装されていないメソッドを追加」があるので それを選択することでメソッドが沢山追加される。 この追加されたメソッドは&u(){使わなくても必ず実装されていなければならない}ので注意。 さて、順番に解説していこう。 まず、GestureDetectorのインスタンス変数(インスタンス変数はメンバ変数とだいたい同義)を onCreateの前で宣言しておく。 そして、onCreate内でGestureDetectorのインスタンス変数に実体を持たせる(インスタンス生成) 次にタッチイベントを捕捉するためのonTouchEventメソッド内で &bold(){gestureDitector.onTouchEvent(event)}を記述することでGestureDetectorの イベントを取ることが出来るようになる。 これでGestureDetectorの実装は完了。 #endregion #region(gestureイベントの簡単な解説) ・onDoubleTap  素早く二回画面をタップすることで呼ばれる。 ・onDoubleTapEvent  onDoubleTap中に行われたスクロールなどのイベントで呼ばれる。 ・onSingleTapConfirmed  一回タップしたときに呼ばれる。 ・onDown  画面を押したときに呼ばれる。 ・onFling  フリック(画面を指ではじくようになぞる)したときに呼ばれる。 ・onLongPress  画面を長押ししたときに呼ばれる。 ・onScroll  ゆっくり画面をなぞった時に呼ばれる。 ・onShowPress  画面を押した(すぐに指を離したりなぞったりしない)ときに呼ばれる。 ・onSingleTapUp  画面をタップしたときに呼ばれる。(ダブルタップ時にも呼ばれる) #endregion #region(ちょっとした小話) 今回紹介したGestureDetectorは簡単に複雑な処理を取ることが出来るという便利なものなのだが、 使わないものも必ず実装しなければならない=余計な判定もしなければならない。 このため、無駄な処理を行うことになるのでパフォーマンス面で不利になる可能性もある。 なので、使用するタッチイベントが一部だけというアプリケーションの場合にはGestureDetectorに頼らず、 自力で判定などを実装することで処理を軽量化するという方法もある。(慣れてきたらの話だが) #endregion
今回は、今まで使ってきたタッチ操作よりもより複雑なタッチ判定を取れる &bold(){&color(red){GestureDetector}}について紹介していこうと思う。 まずは下記のソースを見よう見まねで書いて実行してみよう。 #region(ソース) #highlight(linenumber, java){{ public class MainActivity extends Activity implements GestureDetector.OnGestureListener, GestureDetector.OnDoubleTapListener{ //GestureDetectorインスタンス変数 private GestureDetector gestureDitector; @Override  protected void onCreate(Bundle savedInstanceState) {   super.onCreate(savedInstanceState);   setContentView(R.layout.activity_main);   //GestureDetectorインスタンス生成   gestureDitector = new GestureDetector(this,this);  }  //タッチイベント用のメソッドを作る  public boolean onTouchEvent(MotionEvent event){   //gestureDitector.onTouchEventメソッドでタッチイベントの判定と振り分けを行う。   gestureDitector.onTouchEvent(event);  return false;  }  @Override  public boolean onDoubleTap(MotionEvent e) {   Toast.makeText(this, "onDoubleTap", Toast.LENGTH_LONG).show();   return false;  }  @Override  public boolean onDoubleTapEvent(MotionEvent e) {   Toast.makeText(this, "onDoubleTapEvent", Toast.LENGTH_LONG).show();   return false;  }  @Override  public boolean onSingleTapConfirmed(MotionEvent e) {   Toast.makeText(this, "onSingleTapConfirmed", Toast.LENGTH_LONG).show();   return false;  }  @Override  public boolean onDown(MotionEvent e) {   Toast.makeText(this, "onDown", Toast.LENGTH_LONG).show();   return false;  }  @Override  public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {   Toast.makeText(this, "onFling", Toast.LENGTH_LONG).show();   return false;  }  @Override  public void onLongPress(MotionEvent e) {   Toast.makeText(this, "onLongPress", Toast.LENGTH_LONG).show();  }  @Override  public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {   Toast.makeText(this, "onScroll", Toast.LENGTH_LONG).show();   return false;  }  @Override  public void onShowPress(MotionEvent e) {   Toast.makeText(this, "onShowPress", Toast.LENGTH_LONG).show();  }  @Override  public boolean onSingleTapUp(MotionEvent e) {   Toast.makeText(this, "onSingleTapUp", Toast.LENGTH_LONG).show();   return false;  } } }} #endregion #region(簡単な解説) 今までimplementsしてきたonTouchListenerではなく、 &bold(){GestureDetector.OnGestureListener} と &bold(){GestureDetector.OnDoubleTapListener} をimplemantsすることで今までよりも複雑なタッチ判定を取れる。 これをimplemantsしたときに表示されるエラーの中に「実装されていないメソッドを追加」があるので それを選択することでメソッドが沢山追加される。 この追加されたメソッドは&u(){使わなくても必ず実装されていなければならない}ので注意。 さて、順番に解説していこう。 まず、GestureDetectorのインスタンス変数(インスタンス変数はメンバ変数とだいたい同義)を onCreateの前で宣言しておく。 そして、onCreate内でGestureDetectorのインスタンス変数に実体を持たせる(インスタンス生成) 次にタッチイベントを捕捉するためのonTouchEventメソッド内で &bold(){gestureDitector.onTouchEvent(event)}を記述することでGestureDetectorの イベントを取ることが出来るようになる。 これでGestureDetectorの実装は完了。 #endregion #region(gestureイベントの簡単な解説) ・onDoubleTap  素早く二回画面をタップすることで呼ばれる。 ・onDoubleTapEvent  onDoubleTap中に行われたスクロールなどのイベントで呼ばれる。 ・onSingleTapConfirmed  一回タップしたときに呼ばれる。 ・onDown  画面を押したときに呼ばれる。 ・onFling  フリック(画面を指ではじくようになぞる)したときに呼ばれる。 ・onLongPress  画面を長押ししたときに呼ばれる。 ・onScroll  ゆっくり画面をなぞった時に呼ばれる。 ・onShowPress  画面を押した(すぐに指を離したりなぞったりしない)ときに呼ばれる。 ・onSingleTapUp  画面をタップしたときに呼ばれる。(ダブルタップ時にも呼ばれる) #endregion #region(ちょっとした小話) 今回紹介したGestureDetectorは簡単に複雑な処理を取ることが出来るという便利なものなのだが、 使わないものも必ず実装しなければならない=余計な判定もしなければならない。 このため、無駄な処理を行うことになるのでパフォーマンス面で不利になる可能性もある。 なので、使用するタッチイベントが一部だけというアプリケーションの場合にはGestureDetectorに頼らず、 自力で判定などを実装することで処理を軽量化するという方法もある。(慣れてきたらの話だが) #endregion

表示オプション

横に並べて表示:
変化行の前後のみ表示: