android - 从 View 长按触发 DOWN 事件时从对话框注册 UP/CANCEL

标签 android gridview dialog motionevent long-press

我有一个用户体验要求,即用户触发 Dialog通过长按 GridView 中的单元格.

  • 虽然 Dialog显示用户必须能够在屏幕上移动他们的手指/拇指而不会触发UP/CANCEL当他们离开 GridView 边界时的事件细胞。

  • 当用户最终断开与屏幕的接触时,就是我要捕捉的内容GridView似乎为 UP/CANCEL 注册了一些误报我们没有看到使用任何其他 View 。

  • 问题是原始 View 捕获所有触摸事件,因为DOWN被它俘虏了。

  • 在原始 View 中的 UP 事件之后,对话框才注册/看不到任何触摸。

我试过取消原始触摸事件并使用 dispatchTouch() , 等等 没有喜悦。

有什么想法吗?

最佳答案

我在我的一个项目中使用过类似的东西。

为 gridView 的每个单元格分配一个 OnTouchListener 并覆盖 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;
}

在可运行的 mLongPressed 中打开对话框,它只会在用户触摸同一点一秒钟时运行。当然,您可以更改他可以移动的距离以及他需要按下以注册为长按的时间。但是,我建议使用 getScaledTouchSlop() 来计算距离。

final Handler handler = new Handler(); 
Runnable mLongPressed = new Runnable() { 
    public void run() { 
        // OPEN DIALOG
        isLongPressed = true;
    }   
};

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

关于android - 从 View 长按触发 DOWN 事件时从对话框注册 UP/CANCEL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26490815/

相关文章:

android - HTML 文件未从 Android 应用程序发送至 HP ePrint 应用程序进行打印

C# 获取按钮单击 gridview 上每一行的单元格值

android - 我怎样才能拥有带有手动控制的水平listView或gridView

javascript - 在 iframe 中定位对话框

java - Swing 中模态对话框的正确父级

java - 如何检查图像大小小于 100kb android

android - 如何向 android.widget.SearchView 添加额外的数据?

c# - 我怎样才能在 gridview 中获取超链接的值(value)?

Qt,非模态对话框不会自行关闭

android - 将图像从 webview 保存到某个文件夹