【参考链接】
用户手势检测-GestureDetector使用详解http://blog.csdn.net/harvic880925/article/details/39520901
跟GestureDetector相关的有两个接口和一个外部类
接口:OnGestureListener、OnDoubleTapListener
内部类:SimpleOnGestureListener
他们之间的关系为
创建GestureDetector对象需要传递OnGestureListener接口
然后还可以给GestureDetector对象设置OnDoubleTapListener接口
SimpleOnGestureListner其实就是这两个接口的函数的集合,实现了这两个接口并默认实现为空,让我们可以根据需要重写方法。
使用方式为
创建GestureDetector对象,并在onTouchEvent()/onTouchListener中接收MotionEvent进行处理
//对于先发生longPress再发生fling的情况 //不加只触发longPress() //加上下面这一句只触发fling() mGestureDetector.setIsLongpressEnabled(false); } @Override public boolean onTouchEvent(MotionEvent event) { super.onTouchEvent(event); //先做一些自己的处理 switch (event.getAction()) { case MotionEvent.ACTION_DOWN: Log.e("shadowfaxghh", "ACTION_DOWN"); obtaionVelocityTracker(); mVelocityTracker.addMovement(event); break; case MotionEvent.ACTION_MOVE: Log.e("shadowfaxghh", "ACTION_MOVE"); obtaionVelocityTracker(); mVelocityTracker.addMovement(event); break; case MotionEvent.ACTION_UP: Log.e("shadowfaxghh", "ACTION_UP"); if (mVelocityTracker != null) { //计算速度 mVelocityTracker.computeCurrentVelocity(1000, scaledMaximumFlingVelocity); //获取x方向的速度 int xVelocity = (int) mVelocityTracker.getXVelocity(); Log.e("shadowfaxghh", "xVelocity=" + xVelocity); recycleVelocityTracker(); } break; case MotionEvent.ACTION_CANCEL: Log.e("shadowfaxghh", "ACTION_CANCEL"); recycleVelocityTracker(); break; default: break; } mGestureDetector.onTouchEvent(event); return true; } private void obtaionVelocityTracker() { if (mVelocityTracker == null) mVelocityTracker = VelocityTracker.obtain(); } private void recycleVelocityTracker() { if (mVelocityTracker != null) { mVelocityTracker.clear(); mVelocityTracker.recycle(); mVelocityTracker = null; } } }
可以使用如上的代码实验一下都什么情况下触发相应的方法
onDown()
每次ACTION_DOWN都触发
onShowPress()
ACTION_DOWN并超过一段极短事件后触发
onSingleTapUp()
ACTION_DOWN接ACTION_UP时触发
如果有ACTION_MOVE则不会触发
onScroll()
ACTION_MOVE时触发,在ACTION_UP之前
onFling()
ACTION_UP后速度超出一定底限后触发
参数中的速度跟自己计算的速度一致
onDoubleTap()
连续两次点击时触发