我在我的一个项目中使用了类似的东西.
将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;
}
};
通过在我的项目中使用此代码,用户可以在整个屏幕上移动手指而不会触发ACTION_UP.只有当他举起手指时,它才被触发.