How to distinguish between move and click in onTouchEvent()?(onTouchEvent()中如何区分移动和点击?)
问题描述
在我的应用程序中,我需要同时处理移动和点击事件.
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()中如何区分移动和点击?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:onTouchEvent()中如何区分移动和点击?
基础教程推荐
- navigator.geolocation.getCurrentPosition 在 Android 浏览器上 2022-01-01
- AdMob 广告未在模拟器中显示 2022-01-01
- Android:getLastKnownLocation(LocationManager.NETWORK_PROVIDER 2022-01-01
- Cocos2d iPhone 非矩形精灵触摸检测 2022-01-01
- 通过重定向链接在 Google Play 中打开应用 2022-01-01
- libGDX 从精灵或纹理中获取像素颜色 2022-01-01
- NSString intValue 不能用于检索电话号码 2022-01-01
- iOS4 创建后台定时器 2022-01-01
- iPhone - 获取给定地点/时区的当前日期和时间并将其与同一地点的另一个日期/时间进行比较的正确方法 2022-01-01
- 如何从 logcat 中删除旧数据? 2022-01-01
