gpt4 book ai didi

android - 处理程序在长按时不接收消息

转载 作者:行者123 更新时间:2023-11-30 03:53:13 25 4
gpt4 key购买 nike

尝试通过从 GestureDetector 借用代码来实现长按,我得到了一个最小的示例,当 onTouchEvent() 返回 true 时,它​​不会在 GestureHandler 中接收消息。当返回 false 时,消息确实被传递,但是事件处理结束并且长按不会被取消。

有没有办法让这段代码与返回 true 的 onTouchEvent() 一起工作?

public class OverlayView extends View  {
private static final int LONG_PRESS = 1;
private Handler handler;
private static final String TAG = OverlayView.class.getName();
private class GestureHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case LONG_PRESS:
dispatchLongPress();
break;

default:
throw new RuntimeException("Unknown message " + msg);
}
}
}

public OverlayView(Context context, AttributeSet attrs) {
super(context, attrs);
handler = new GestureHandler();
}

private void dispatchLongPress() {
Toast.makeText(getContext(), "Long Press", Toast.LENGTH_SHORT).show();
}

@Override
public boolean onTouchEvent(MotionEvent e) {
Log.d(TAG, e.toString());
switch (e.getAction()) {
case MotionEvent.ACTION_DOWN:
handler.removeMessages(LONG_PRESS);
handler.sendEmptyMessageAtTime(LONG_PRESS, e.getDownTime() + 1000);
break;
case MotionEvent.ACTION_MOVE:
handler.removeMessages(LONG_PRESS);
break;
case MotionEvent.ACTION_UP:
handler.removeMessages(LONG_PRESS);
break;
default:
break;
}

return true;
}
}

最佳答案

即使您的手非常稳定,您也可能会创建一个ACTION_MOVE 事件:

case MotionEvent.ACTION_MOVE:
handler.removeMessages(LONG_PRESS);
break;

您的手指只会移动几个像素,但这足以消除您的长按回调。

Android 使用一对静态变量标签 ___SLOP 并计算第一个 ACTION_DOWN 事件与当前事件之间的距离。一旦 MotionEvent 超出了溢出阈值,它才会取消回调。我建议使用相同的方法。

关于android - 处理程序在长按时不接收消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13806212/

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