作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
尝试通过从 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/
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 8 年前。 Improve
我是一名优秀的程序员,十分优秀!