如果要对一个View进行手势监听,比如,单击,双击,滑动等,可以通过自定义View,重写View 的onTouchEvent方法,定制自己想要监听的手势。不过,如果我们只是对一个普通的View监听一些常用的手势,大可不必选择自定义View,有更简单的方法可以实现。Android为我们提供了GestureDetector类,封装了一些常用的手势。
GestureDetector的简单用法
GestureDetector提供了两个监听手势的接口:OnGestureListener和OnDoubleTapListener,一般,先定义一个具体监听类来实现接口,然后实现所有的方法:
class MyGestureListener implements GestureDetector.OnGestureListener,GestureDetector.OnDoubleTapListener{
@Override
public boolean onDown(MotionEvent e) {
Log.i(TAG,"MyGestureListener onDown");
return false;
}
@Override
public void onShowPress(MotionEvent e) {
Log.i(TAG,"MyGestureListener onShowPress");
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
Log.i(TAG,"MyGestureListener onSingleTapUp");
return false;
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
Log.i(TAG,"MyGestureListener onScroll");
return false;
}
@Override
public void onLongPress(MotionEvent e) {
Log.i(TAG,"MyGestureListener onLongPress");
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
Log.i(TAG,"MyGestureListener onFling");
return false;
}
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
Log.i(TAG,"MyGestureListener onSingleTapConfirmed");
return false;
}
@Override
public boolean onDoubleTap(MotionEvent e) {
Log.i(TAG,"MyGestureListener onDoubleTap");
return false;
}
@Override
public boolean onDoubleTapEvent(MotionEvent e) {
Log.i(TAG,"MyGestureListener onDoubleTapEvent");
return false;
}
}
第二步,为View设置onTouch事件:
mImageView=(ImageView)findViewById(R.id.imageView);
mGestureDetector=new GestureDetector(this,new MyGestureListener());
mImageView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (mGestureDetector!=null){
return mGestureDetector.onTouchEvent(event);
}
return false;
}
});
这样,就完成了GestureDetector所有手势的监听。在屏幕上滑动,可以看到Log:
08-08 13:10:55.514 3187-3187/com.jx.gesturedetectorlearn I/MainActivity﹕ MyGestureListener onDown
08-08 13:10:55.571 3187-3187/com.jx.gesturedetectorlearn I/MainActivity﹕ MyGestureListener onScroll
08-08 13:10:55.589 3187-3187/com.jx.gesturedetectorlearn I/MainActivity﹕ MyGestureListener onScroll
08-08 13:10:55.605 3187-3187/com.jx.gesturedetectorlearn I/MainActivity﹕ MyGestureListener onScroll
08-08 13:10:55.622 3187-3187/com.jx.gesturedetectorlearn I/MainActivity﹕ MyGestureListener onScroll
08-08 13:10:55.640 3187-3187/com.jx.gesturedetectorlearn I/MainActivity﹕ MyGestureListener onScroll
08-08 13:10:55.654 3187-3187/com.jx.gesturedetectorlearn I/MainActivity﹕ MyGestureListener onScroll
08-08 13:10:55.671 3187-3187/com.jx.gesturedetectorlearn I/MainActivity﹕ MyGestureListener onScroll
08-08 13:10:55.688 3187-3187/com.jx.gesturedetectorlearn I/MainActivity﹕ MyGestureListener onScroll
08-08 13:10:55.705 3187-3187/com.jx.gesturedetectorlearn I/MainActivity﹕ MyGestureListener onScroll
08-08 13:10:55.722 3187-3187/com.jx.gesturedetectorlearn I/MainActivity﹕ MyGestureListener onScroll
08-08 13:10:55.739 3187-3187/com.jx.gesturedetectorlearn I/MainActivity﹕ MyGestureListener onScroll
08-08 13:10:55.756 3187-3187/com.jx.gesturedetectorlearn I/MainActivity﹕ MyGestureListener onScroll
08-08 13:10:55.773 3187-3187/com.jx.gesturedetectorlearn I/MainActivity﹕ MyGestureListener onScroll
08-08 13:10:55.807 3187-3187/com.jx.gesturedetectorlearn I/MainActivity﹕ MyGestureListener onFling
08-08 13:10:59.198 3187-3187/com.jx.gesturedetectorlearn I/MainActivity﹕ MyGestureListener onDown
08-08 13:10:59.238 3187-3187/com.jx.gesturedetectorlearn I/MainActivity﹕ MyGestureListener onScroll
08-08 13:10:59.255 3187-3187/com.jx.gesturedetectorlearn I/MainActivity﹕ MyGestureListener onScroll
08-08 13:10:59.260 3187-3187/com.jx.gesturedetectorlearn I/MainActivity﹕ MyGestureListener onFling
08-08 13:10:59.352 3187-3187/com.jx.gesturedetectorlearn I/MainActivity﹕ MyGestureListener onDown
08-08 13:10:59.466 3187-3187/com.jx.gesturedetectorlearn I/MainActivity﹕ MyGestureListener onSingleTapUp
08-08 13:10:59.653 3187-3187/com.jx.gesturedetectorlearn I/MainActivity﹕ MyGestureListener onSingleTapConfirmed
从上面可以看到,已经成功的监听到了View各种手势。
GestureDetector各个方法的代表的手势
OnGestureListener中的方法:
onDown:手指按下,会立即触发
onShowPress:按下超过100毫秒,会触发,一般提示用户,按压动作已经被识别。
onSingleTapUp:手指抬起
onScroll:滑动时调用(会调用多次)
onLongPress:长按手势,超过600毫秒时调用
onFling:滑动结束时会调用,只调用一次
OnDoubleTapListener中的方法:
onSingleTapConfirmed:单击事件(已经确认不会触发双击事件)
onDoubleTap:双击事件
onDoubleTapEvent:双击过程中会触发(多次调用)
一般,我们不需要监听所有事件,那么我们可以继承SimpleOnGestureListener,它是GestureDetector里面的一个静态内部类,我们可以继承SimpleOnGestureListener,实现我们想要监听的方法就好了:
class SimpleGestureListener extends GestureDetector.SimpleOnGestureListener{
@Override
public boolean onDoubleTap(MotionEvent e) {
return super.onDoubleTap(e);
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
return super.onFling(e1, e2, velocityX, velocityY);
}
}