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