看完这篇还不会 GestureDetector 手势检测,我跪搓衣板! (3)

onLongPress 很简单,就是长按事件的回调,比如说长按复制,长按弹窗等等,它不但应用广泛,同时使用也非常简单,这里就不唠叨了

private final GestureDetector.SimpleOnGestureListener listener = new GestureDetector.SimpleOnGestureListener(){ @Override public void onLongPress(MotionEvent e) { MyToast.makeToast(GestureDetectorActivity.this, "onLongPress"); // 后续工作 super.onLongPress(e); } }; onScroll

onScroll 方法和 onFling 很像,唯一的区别在于,onFling 的参数是滑动的速度,而 onScroll 的后两个参数则是滑动的距离:

参数 意义
e1   手指按下时的 MotionEvent  
e2   手指抬起时的 MotionEvent  
distanceX   在 X 轴上划过的距离  
distanceY   在 Y 轴上划过的距离  
private final GestureDetector.SimpleOnGestureListener listener = new GestureDetector.SimpleOnGestureListener(){ @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { MyToast.makeToast(GestureDetectorActivity.this, "onScroll X = " + distanceX + " Y = " + distanceY); return super.onScroll(e1, e2, distanceX, distanceY); } }; onShowPress

这个方法我其实觉得作用不是很大,因为它是在 View 被点击(按下)是调用,其作用是给用户一个视觉反馈,让用户知道我这个控件被点击了,这样的效果我们完全可以用 Material design 的 ripple 实现,或者直接 drawable 写个背景也行。

如果说它有什么特别指出的话,它是一种延时回调,延迟时间是 180 ms。也就是说用户手指按下后,如果立即抬起或者事件立即被拦截,时间没有超过 180 ms的话,这条消息会被 remove 掉,也就不会触发这个回调。

private final GestureDetector.SimpleOnGestureListener listener = new GestureDetector.SimpleOnGestureListener(){ @Override public void onShowPress(MotionEvent e) { MyToast.makeToast(GestureDetectorActivity.this, "onShowPress");// >150ms 时调用 super.onShowPress(e); } }; onSingleTapUp

对于 onSingleTapUp 网上有很多分析,但我觉得过于复杂了,其实这东西很简单。举个例子你就懂了:

之前我们讲过双击事件,那好 onSingleTapUp 就是在 双击事件的第一次点击时回调。也就是说但你点击了一个控件时(双击第一下),这个回调马上会被调用,然后迅速点第二下(双击事件的第二下),则其不会被调用。

类型 触发次数 摘要
onSingleTapUp   1   在双击的第一次抬起时触发  
onSingleTapConfirmed   0   双击发生时不会触发。  
onClick   2   在双击事件时触发两次。  

它和 onSingleTapConfirmed 的区别也就很明显了,onSingleTapConfirmed 在发生双击时,会回调两次,而 onSingleTapUp 只会在双击的的第一次回调。

private final GestureDetector.SimpleOnGestureListener listener = new GestureDetector.SimpleOnGestureListener(){ @Override public boolean onSingleTapUp(MotionEvent e) {// 双击第一次抬起触发,第二次不触发 Log.d("onSingleTapUp", "onSingleTapUp");// >150ms 时调用 return super.onSingleTapUp(e); } }; SimpleOnGestureListener

SimpleOnGestureListener 中包含了以上所有方法的空实现,之所以在文末再一次提及他,主要是想讲下它的方便之处。

我们以监听 OnDoubleTapListener 为例,如果想要使用 OnDoubleTapListener 接口则需要这样进行设置:

GestureDetector detector = new GestureDetector(this, new GestureDetector .SimpleOnGestureListener()); detector.setOnDoubleTapListener(new GestureDetector.OnDoubleTapListener() { @Override public boolean onSingleTapConfirmed(MotionEvent e) { Toast.makeText(MainActivity.this, "onSingleTapConfirmed", Toast.LENGTH_SHORT).show(); return false; } @Override public boolean onDoubleTap(MotionEvent e) { Toast.makeText(MainActivity.this, "onDoubleTap", Toast.LENGTH_SHORT).show(); return false; } @Override public boolean onDoubleTapEvent(MotionEvent e) { Toast.makeText(MainActivity.this,"onDoubleTapEvent",Toast.LENGTH_SHORT).show(); return false; } });

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpffgf.html