タッチイベントやジェスチャーイベントの実装方法|Android開発
Androidでタッチイベントを処理する場合、GestureDetector
を使うと様々なジェスチャーやイベントが検出できます。
タップとダブルタップを実装するサンプル
下記はGestureDetector
の簡単な使い方です。ImageView
上のタップとダブルタップを判定します。
リスナ登録
View
またはActivity
のタッチリスナを登録します。
public class ImageActivity extends Activity {
private GestureDetector mGestureDetector;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_image);
/* Touch event */
((ImageView) findViewById(R.id.sample_img)).setOnTouchListener(mTouchEventListener);
mGestureDetector = new GestureDetector(this, mGestureListener);
}
// これらの詳細は以降の項目に記載します.
private GestureDetector.SimpleOnGestureListener mGestureListener;
private View.OnTouchListener mTouchEventListener;
}
ジェスチャーに対する処理の実装
GestureDetector.SimpleOnGestureListenerを継承したクラスを作成し、必要なイベントをオーバーライドすることで様々なジェスチャーや目的のタッチイベントを処理できます。下記の実装内容はログ出力のみです。
private GestureDetector.SimpleOnGestureListener mGestureListener = new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onDoubleTap(MotionEvent e) {
Log.i(TAG, "onDoubleTap");
return true;
}
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
Log.i(TAG, "onSingleTapConfirmed");
return true;
}
};
タッチイベントリスナの内容
private View.OnTouchListener mTouchEventListener = new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
mGestureDetector.onTouchEvent(event);
return true;
}
};
アクティビティのタッチリスナ使用時
View.OnTouchListener
ではなくActivity.onTouchEvent
を使用する場合は以下のようになります。
@Override
public boolean onTouchEvent(MotionEvent e) {
mGestureDetector.onTouchEvent(e);
return true;
}
スワイプジェスチャー処理
指で画面を横方向にスワイプした場合に別画面を表示するサンプルです。
mGestureDetector = new GestureDetector(this, mSwipeGestureListener);
mSwipeCallback = mOpenNext;
private interface ISwipeCallback {
void onSwipe();
}
private ISwipeCallback mSwipeCallback;
private ISwipeCallback mOpenNext = new ISwipeCallback() {
@Override
public void onSwipe() {
Intent intent = new Intent(ImageActivity.this, NextActivity.class);
startActivity(intent);
mSwipeCallback = new ISwipeCallback() {
@Override
public void onSwipe() {
}
};
}
};
private GestureDetector.SimpleOnGestureListener mSwipeGestureListener = new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
// e1 は始点、e2 は現在地.
float diffX = e2.getX() - e1.getX();
if (diffX <= -100) {
// 条件成立後も onScroll は通知される. 成立1回目のみ処理したい場合はフラグなどで判定が必要.
mSwipeCallback.onSwipe();
return true;
}
return false;
}
};
処理内容
onScroll()
を実装し、移動量を判定します。distanceX
, distanceY
は前回のonScroll()
からの差分です。
e1
は始点、e2
は現在位置です。今回はe1
とe2
のみで移動量が判定できるため、それだけを使用しました。
mOpenNext
でmSwipeCallback
に空処理を登録しているのは、2回目以降のイベントを処理させないためです。