我有一个UX要求,即用户通过长按GridView中的单元格来触发Dialog.
>显示对话框时,用户必须能够在屏幕周围移动手指/拇指,而不会在离开GridView单元格边界时触发UP / CANCEL事件.
>当用户最终断开与屏幕的联系时,我正在寻找捕获. GridView似乎记录了UP / CANCEL的一些误报,我们没有看到使用任何其他视图.
>问题是原始视图捕获所有触摸事件,因为DOWN被它捕获.
>在原始视图的UP事件之后,对话框才会注册/看不到任何触摸.
我尝试取消原始触摸事件并使用dispatchTouch()等.没有快乐.
有任何想法吗?
解决方法
我在我的一个项目中使用了类似的东西.
将OnTouchListener分配给gridView的每个单元格并覆盖OnTouch方法.
@Override public boolean onTouch(View v,MotionEvent event) { boolean isLongPressed; int mSwipeSlop = ViewConfiguration.get(context). getScaledTouchSlop(); boolean mSwiping; switch (event.getAction()) { case MotionEvent.ACTION_DOWN: handler.postDelayed(mLongPressed,1000); break; case MotionEvent.ACTION_CANCEL: handler.removeCallbacks(mLongPressed); break; case MotionEvent.ACTION_MOVE: float x = event.getX() + v.getTranslationX(); float deltaX = x - mDownX; float deltaXAbs = Math.abs(deltaX); float y = event.getY() + v.getTranslationY(); float deltaY = Y - mDownY; float deltaYAbs = Math.abs(deltaY); float absDist = Math.sqrt(Math.pow(deltaXAbs,2) + Math.pow(deltaXAbs,2)); if (!mSwiping) { if (absDist > mSwipeSlop) { mSwiping = true; handler.removeCallbacks(mLongPressed); } } break; case MotionEvent.ACTION_UP: handler.removeCallbacks(mLongPressed); if (isLongPressed) { // DO ACTION UP } break; default: return false; } return true; }
在runnable mLongPressed中打开对话框,该对话框仅在用户触摸相同位置一秒钟时才会运行.您可以更改他可以移动的距离以及按需注册为长按的时间.但是,我建议使用getScaledTouchSlop()作为距离.
final Handler handler = new Handler(); Runnable mLongPressed = new Runnable() { public void run() { // OPEN DIALOG isLongPressed = true; } };