public class MyGesture extends SimpleOnGestureListener { private GestureDetector gd; // onGestureListener需要F和onTouchListener配合使用,实际上是onTouchListenerF监听到用户的 // 触摸,他把他所有监听到的用户触摸通知"手势识别"类对象,手势识别类对象处理后触发对应的函数,例如onFling, onLongPress等等。 public void test(MotionEvent ev) { gd.onTouchEvent(ev); } // GestureDetector默认是打开LongPress通知的,但是有个问题,长按后,手不离开屏幕且滑动,这个时候发现没有滑动事件。 // 这个问题的解决办法是设置手势识别对象,禁止产生长按事件 // gd.setIsLongpressEnabled(false); // 当然,没有禁用长按事件,滑动事件还是有效的,只是要确保触屏后马上滑动,不要等系统产生了长按。 public final class GestureListener implements OnGestureListener { @Override public boolean onDown(MotionEvent e) { // 触摸屏按下时立刻触发 return false; } @Override public void onShowPress(MotionEvent e) { // 短按,触摸屏按下后片刻后抬起,会触发这个手势,如果迅速抬起则不会;强调的是没有松开或者拖动的状态,由一个ACTION_DOWN触发 } @Override public boolean onSingleTapUp(MotionEvent e) { // 抬起,手指离开触摸屏时触发(长按、滚动、滑动时,不会触发这个手势) return false; } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { // 用户按下触摸屏,并拖动,由1个 ACTION_DOWN, 多个ACTION_MOVE触发 return false; } @Override public void onLongPress(MotionEvent e) { // 长按,触摸屏按下后既不抬起也不移动,由多个 ACTION_DOWN触发 } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { // 滑动,触摸屏按下后快速移动并抬起,会先触发滚动手势,跟着触发一个滑动手势 // 参数解释: // e1:第1个ACTION_DOWN MotionEvent // e2:最后一个ACTION_MOVE MotionEvent // velocityX:X轴上的移动速度,像素/秒 // velocityY:Y轴上的移动速度,像素/秒 return false; } } public final class DoubleTapListener implements OnDoubleTapListener { @Override public boolean onSingleTapConfirmed(MotionEvent e) { // 单击确认,即很快的按下并抬起,但并不连续点击第二下 return false; } @Override public boolean onDoubleTap(MotionEvent e) { // 双击,手指在触摸屏上迅速点击第二下时触发 return false; } @Override public boolean onDoubleTapEvent(MotionEvent e) { // 双击事件发生的时候,按下和抬起各触发一次 return false; } // 对于自定义View,使用手势识别有两处陷阱可能会浪费你的不少时间。 // 1:View必须设置longClickable为true,否则手势识别无法正确工作,只会返回Down, Show, Long三种手势 // 2:必须在View的onTouchListener中调用手势识别,而不能像Activity一样重载onTouchEvent,否则同样手势识别无法正确工作 public class MyView extends View { private GestureDetector mGestureDetector; public MyView(Context context, AttributeSet attrs) { super(context, attrs); mGestureDetector = new GestureDetector(context, null); setLongClickable(true); this.setOnTouchListener(new OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { return mGestureDetector.onTouchEvent(event); } }); } } }}