【发布时间】:2012-10-06 11:42:12
【问题描述】:
我试图从 Android 中的 MotionEvents 序列中准确读取 ACTION_MOVE 增量。
然而,我用手指在屏幕上滑动的测试表明,在最初的ACTION_DOWN 之后,几个MotionEvents 不会传递给听众。只有在进行了足够大的移动之后,才会传递具有相对较大增量的ACTION_MOVE 事件。在第一次ACTION_MOVE 事件之后,所有增量都再次变得非常小。
或者,也可以触摸屏幕 (ACTION_DOWN) 并稍微移动一下,根本不会传递 ACTION_MOVE 事件。
我了解,对于许多用途,具有一定的移动(内)灵敏度是有益的。但是,有没有办法避免合并ACTION_MOVE 事件,从而交付每一个小的初始动作? ACTION_DOWN位置和第一个ACTION_MOVE位置之间的最小距离是否可以设置阈值?
这里是一些示例代码:
private float lastX;
private float lastY;
public boolean onTouch(View v, MotionEvent ev) {
final float y = ev.getX();
final float x = ev.getY();
final int hs = ev.getHistorySize();
final int ac = ev.getAction();
switch(ac)
{
case MotionEvent.ACTION_DOWN:
{
this.lastX = x;
this.lastY = y;
Log.i("TEST", "Down at " + x + "/" + y + " (History size="+hs+")");
return true;
}
case MotionEvent.ACTION_MOVE:
{
Log.i("TEST", "Move at " + x + "/" + y + ": Delta="+(lastX-x)+"/"+(lastY-y) + " (History size="+hs+")");
this.lastX = x;
this.lastY = y;
return true;
}
case MotionEvent.ACTION_UP:
{
Log.i("TEST", "Up at " + x + "/" + y + " (History size="+hs+")");
return true;
}
}
}
以及对应的输出:
Down at 376.0/259.0 (History size=0)
Move at 392.0/268.0: Delta=-16.0/-9.0 (History size=0)
Move at 394.0/268.0: Delta=-2.0/0.0 (History size=0)
Move at 395.0/269.0: Delta=-1.0/-1.0 (History size=0)
Move at 394.0/268.0: Delta=1.0/1.0 (History size=0)
Move at 396.0/269.0: Delta=-2.0/-1.0 (History size=0)
Move at 399.0/271.0: Delta=-3.0/-2.0 (History size=1)
Move at 401.0/272.0: Delta=-2.0/-1.0 (History size=0)
Move at 403.0/273.0: Delta=-2.0/-1.0 (History size=0)
Move at 404.0/273.0: Delta=-1.0/0.0 (History size=0)
Move at 405.0/274.0: Delta=-1.0/-1.0 (History size=0)
Move at 406.0/275.0: Delta=-1.0/-1.0 (History size=0)
Up at 406.0/275.0 (History size=0)
换句话说,我想避免第二行 (-16/-9) 的大增量,但接收 1 或 2 的增量...
我在三星 Galaxy S2 和 Note 上进行了测试。
非常感谢任何帮助或建议!
【问题讨论】:
-
是运动中的死区还是 ACTION_DOWN 后的死区 TIME,在此期间 ACTION_MOVE 被禁用?也许您可能想尝试找出哪个。
-
使用 event.getHistoricalX/Y() 方法可以获得更多积分
-
这绝对是运动中的死区。当 (1) 触摸 (
ACTION_DOWN) 并保持手指稳定并在几秒钟后开始移动或 (2) 在屏幕上滑动而不等待时,可以观察到相同的行为。第一个ACTION_MOVE事件始终具有最大的增量——好像在ACTION_MOVE在ACTION_DOWN之后报告之前存在所需的最小增量。
标签: java android motionevent