gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:00:06 25 4
gpt4 key购买 nike

我有一个用户体验要求,即用户触发 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com