在我的应用程序中,我需要同时处理移动和点击事件.
In my application, I need to handle both move and click events.
点击是一个 ACTION_DOWN 动作、几个 ACTION_MOVE 动作和一个 ACTION_UP 动作的序列.理论上,如果您收到一个 ACTION_DOWN 事件,然后是一个 ACTION_UP 事件 - 这意味着用户刚刚单击了您的视图.
A click is a sequence of one ACTION_DOWN action, several ACTION_MOVE actions and one ACTION_UP action. In theory, if you get an ACTION_DOWN event and then an ACTION_UP event - it means that the user has just clicked your View.
但实际上,此序列不适用于某些设备.在我的三星 Galaxy Gio 上,只需单击我的视图就会得到这样的序列:ACTION_DOWN,几次 ACTION_MOVE,然后是 ACTION_UP.IE.我收到一些带有 ACTION_MOVE 操作代码的意外 OnTouchEvent 触发.我从来没有(或几乎从来没有)得到序列 ACTION_DOWN -> ACTION_UP.
But in practice, this sequence doesn't work on some devices. On my Samsung Galaxy Gio I get such sequences when just clicking my View: ACTION_DOWN, several times ACTION_MOVE, then ACTION_UP. I.e. I get some unexpectable OnTouchEvent firings with ACTION_MOVE action code. I never (or almost never) get sequence ACTION_DOWN -> ACTION_UP.
我也不能使用 OnClickListener,因为它没有给出点击的位置.那么如何检测点击事件并将其与移动区别开来呢?
I also cannot use OnClickListener because it does not gives the position of the click. So how can I detect click event and differ it from move?
这是另一个非常简单的解决方案,不需要您担心手指被移动.如果您将点击作为简单移动距离的基础,那么您如何区分点击和长点击.
Here's another solution that is very simple and doesn't require you to worry about the finger being moved. If you are basing a click as simply the distance moved then how can you differentiate a click and a long click.
您可以在其中添加更多智能并包括移动的距离,但我还没有遇到一个实例,即用户可以在 200 毫秒内移动的距离应该构成移动而不是点击.
You could put more smarts into this and include the distance moved, but i'm yet to come across an instance when the distance a user can move in 200 milliseconds should constitute a move as opposed to a click.
setOnTouchListener(new OnTouchListener() {
private static final int MAX_CLICK_DURATION = 200;
private long startClickTime;
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: {
startClickTime = Calendar.getInstance().getTimeInMillis();
break;
}
case MotionEvent.ACTION_UP: {
long clickDuration = Calendar.getInstance().getTimeInMillis() - startClickTime;
if(clickDuration < MAX_CLICK_DURATION) {
//click event has occurred
}
}
}
return true;
}
});
这篇关于onTouchEvent()中如何区分移动和点击?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!