我正在使用onTouch
方法与水龙头ACTION_UP
和GestureDetector
捕捉双击,我的问题是双击水龙头,然后是双击,然后是水龙头。有没有办法让双击水龙头或水龙头?我在逻辑上知道它做的是正确的,所以如果你建议我找到另一种方式评论,请不要投票。谢谢!Android区分水龙头和双击水龙头
回答
我建议您切换到SimpleGestureListener并使用onDoubleTap()和onSingleTapConfirmed()方法。
这就是我正在寻找的,好的,我现在就来看看!谢谢!我看着虽然文件不能相信我没有看到! – Osman
准确地说,它是执行所有工作的GestureDetector,SimpleGestureListener只是GestureListener的一个实现,它总是返回false。 –
除了britzl建议你可能想要检查一下你的逻辑。
我不认为双击会导致多重,它只会导致4个事件,就像你有点提到。虽然手势库(我认为)是最好的选择,你应该考虑的是:
- 商店Motionevent的时间戳(这是其方法之一)上ACTION_UP,那么下一个行动起来进行比较。提供超时时,您会知道它是水龙头还是双击。
那是什么手势听众做
比什么是britzl说更确切地说,GestureDetector
做决定时的东西是一个单一的轻击,双击,长按等实际工作。SimpleGestureListener
只是GestureDetector
用来表示它识别的“听众”。它实现了OnGestureListener
和OnDoubleTapListener
只是为了总是返回false。看看从onTouchEvent(MotionEvent)
片段在GestureDetector
:
case MotionEvent.ACTION_DOWN:
if (mDoubleTapListener != null) {
boolean hadTapMessage = mHandler.hasMessages(TAP);
if (hadTapMessage) mHandler.removeMessages(TAP);
if ((mCurrentDownEvent != null) && (mPreviousUpEvent != null) && hadTapMessage &&
isConsideredDoubleTap(mCurrentDownEvent, mPreviousUpEvent, ev)) {
// This is a second tap
mIsDoubleTapping = true;
// Give a callback with the first tap of the double-tap
handled |= mDoubleTapListener.onDoubleTap(mCurrentDownEvent);
// Give a callback with down event of the double-tap
handled |= mDoubleTapListener.onDoubleTapEvent(ev);
} else {
// This is a first tap
mHandler.sendEmptyMessageDelayed(TAP, DOUBLE_TAP_TIMEOUT);
}
}
mDownFocusX = mLastFocusX = focusX;
mDownFocusY = mLastFocusY = focusY;
if (mCurrentDownEvent != null) {
mCurrentDownEvent.recycle();
}
mCurrentDownEvent = MotionEvent.obtain(ev);
mAlwaysInTapRegion = true;
mAlwaysInBiggerTapRegion = true;
mStillDown = true;
mInLongPress = false;
mDeferConfirmSingleTap = false;
if (mIsLongpressEnabled) {
mHandler.removeMessages(LONG_PRESS);
mHandler.sendEmptyMessageAtTime(LONG_PRESS, mCurrentDownEvent.getDownTime()
+ TAP_TIMEOUT + LONGPRESS_TIMEOUT);
}
mHandler.sendEmptyMessageAtTime(SHOW_PRESS, mCurrentDownEvent.getDownTime() + TAP_TIMEOUT);
handled |= mListener.onDown(ev);
break;
然后期望的结果可以通过适当的听众创造一个GestureDetector
获得:
final View.OnTouchListener touch_listener = new View.OnTouchListener() {
@Override public boolean onTouch(View view, MotionEvent event) {
return _gesture_detector.onTouchEvent(event);
}
private final GestureDetector _gesture_detector = new GestureDetector(getContext()
, new GestureDetector.SimpleOnGestureListener() {
@Override public boolean onSingleTapConfirmed(MotionEvent event) {
// TODO: implement single tap behavior
// NOTE: returning true indicates that the gesture was handled
return true;
}
@Override public boolean onDoubleTap(MotionEvent event) {
// TODO: implement double tap behavior
// NOTE: returning true indicates that the gesture was handled
return true;
}
});
};
从那里,这OnTouchListener
可设置为想要行为的View
。
它通过使用默认GestureHandler
(这是一个Handler
):
private class GestureHandler extends Handler {
GestureHandler() {
super();
}
GestureHandler(Handler handler) {
super(handler.getLooper());
}
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case SHOW_PRESS:
mListener.onShowPress(mCurrentDownEvent);
break;
case LONG_PRESS:
dispatchLongPress();
break;
case TAP:
// If the user's finger is still down, do not count it as a tap
if (mDoubleTapListener != null) {
if (!mStillDown) {
mDoubleTapListener.onSingleTapConfirmed(mCurrentDownEvent);
} else {
mDeferConfirmSingleTap = true;
}
}
break;
default:
throw new RuntimeException("Unknown message " + msg); //never
}
}
}
回想一下GestureDetector
线mHandler.sendEmptyMessageDelayed(TAP, DOUBLE_TAP_TIMEOUT);
。它会延迟通过有效双击手势的超时时间段的通知。 GestureDetector
的行if (hadTapMessage) mHandler.removeMessages(TAP);
会在有效的双击后删除该通知。 GestureHandler
在延迟后收到轻击通知,并使用回调通知GestureListener
使用mDoubleTapListener.onSingleTapConfirmed(mCurrentDownEvent);
。 GestureHandler
将在收到轻击通知时用户的手指停止时将该回调延迟至MotionEvent.ACTION_UP
(由GestureDetector
处理)。
- 1. Iphone:UIWebview和双击水龙头
- 2. Android Widget检测水龙头和双击
- 3. CalendarView:区分水龙头
- 4. 减轻水龙头?
- 5. Android按钮水龙头地区
- 6. UIGestureRecognizer水龙头和删除
- 7. 可视化水龙头视图,显示水龙头指示器
- 8. view.removeFromSuperview()在很多水龙头
- 9. iOS UITapGestureRecognizer多个水龙头
- 10. 推式风暴水龙头
- 11. 错误安装水龙头
- 12. 全景控制,水龙头
- 13. UIScrollView检测水龙头
- 14. SpriteKit水龙头缩放
- 15. FaceBook Connect。水龙头登录
- 16. 检测用户水龙头
- 17. Heroku水龙头推奇怪
- 18. 模拟键盘水龙头
- 19. NFC水龙头计数器
- 20. 级联HBase水龙头
- 21. 水龙头宝石慢
- 22. 检测背景水龙头
- 23. MonoTouch.Dialog - 响应DetailDisclosureButton水龙头
- 24. 禁用水龙头缩放
- 25. iPhone计数手指水龙头和水龙头之间的时间
- 26. UIActionSheet关闭时点击/水龙头
- 27. iOS的UIWebview,禁用双击,允许单击水龙头WKWebview
- 28. Android下的片段响应水龙头
- 29. Hammer.js的水龙头在Android上很慢?
- 30. Android WebView - 抖动/水龙头变化
很难从描述中分辨出你可能做错了什么。请显示你的代码。 –
它不是一个代码问题,水龙头工作的方式是一个ACTION_DOWN和一个ACTION_UP,所以在双击时你会得到两个动作起伏,所以它的工作正常,但我想知道是否有另一种方法来区分单一和双击不会导致两次敲击和双击同时 – Osman