android – 当从View的LongPress触发DOWN事件时,从Dialog注册UP / CANCEL

前端之家收集整理的这篇文章主要介绍了android – 当从View的LongPress触发DOWN事件时,从Dialog注册UP / CANCEL前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个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;
    }   
};

通过在我的项目中使用此代码,用户可以在整个屏幕上移动手指而不会触发ACTION_UP.只有当他举起手指时,它才被触发.

猜你在找的Android相关文章