2010-06-06 15 views
3

错误Android的运动事件处理是否准确?

我在我的钢琴应用程序中有一个奇怪的错误。有时键(以及音符)挂起。我做了很多的调试和范围缩小到什么样子的运动事件处理机器人误差:

DEBUG/(2091): ACTION_DOWN A4 
DEBUG/(2091): KeyDown: A4 
DEBUG/(2091): ACTION_MOVE A4 => A4 
DEBUG/(2091): ACTION_MOVE ignoring 
DEBUG/(2091): ACTION_MOVE A4 => A4 
DEBUG/(2091): ACTION_MOVE ignoring 
DEBUG/(2091): ACTION_MOVE A4 => A4 
DEBUG/(2091): ACTION_MOVE ignoring 
DEBUG/(2091): ACTION_UP B4 //HOW CAN THIS BE???? 
DEBUG/(2091): KeyUp: B4 
DEBUG/(2091): Stream is null, can't stop 
DEBUG/(2091): Hanging Note: A4 X=240-287 EventX=292 Y=117-200 EventY=164 
DEBUG/(2091): KeyUp Note: B4 X=288-335 EventX=292 Y=117-200 EventY=164 

显然,在这里可以看到,无处我突然有另外一个需要注意的ACTION_UP。我不应该首先获得ACTION_MOVE吗?

如日志末尾所示,由于ACTION_UP事件明显位于B4区域,因此在区域检测中绝对不是错误。

日志实现细节

onTouchEvent()通话记录,所以日志是准确的。

为ACTION_MOVE记录相关的伪代码:

Key oldKey = Key.get(event.getHistoricalX(), event.getHistoricalY()); 
Key newKey = Key.get(event.getX(), event.getY()); 

问题

是Android(在坐标跳跃)这个正常的行为?

Can a ACTION_UP just just occurred before any ACTION_MOVE towards it's coordinates?

+0

这是什么设备,你跟踪多个手指?这些日志输出的细目是什么? EventX在这两行中都是292,如果我正确阅读,不应该把B4范围中的“挂起注释”和“KeyUp注释”坐标都放在一起? – adamp 2010-06-06 22:38:40

+0

我没有丝毫,但也好奇。它可以在模拟器和/或其他设备中正常工作吗? – Gerard 2012-04-22 22:51:46

+0

@adamp。回顾一下后,实际上日志输出看起来有点可疑,因为它显示相同的坐标和不同的音符。但是,我已经开始使用指针ID来记录当前按下的按键,并在指针被抬起时释放正确的按键。 – Peterdk 2012-04-22 23:06:08

回答

0

当我尝试在Android上开发简单的射击游戏时,我遇到了类似的问题。如果问题是由硬件引起的,我用来解决问题的技巧可能无法正常工作,但无论如何它值得一试。

一般的想法是有一个“TouchEvents”数组,并循环遍历这个数组。这样,当设备注册多个和/或同时触摸envents时,它们以线性方式存储在数组中,但不能当场处理。你一定要一个接一个地处理它们,消除任何不同步的事件发生。

List<TouchEvent> touchEvents = game.getInput().getTouchEvents(); 
    int len = touchEvents.size(); 
    for(int i = 0; i < len; i++) { 
     TouchEvent event = touchEvents.get(i); 

     if(event.type == TouchEvent.TOUCH_DRAGGED || event.type == TouchEvent.TOUCH_DOWN) ...  

其中:“game.getInput()getTouchEvents()”仅仅指的是一个TouchEvent对象和它的方法,如getTouchEvent

该诀窍对我来说,我希望这有助于在某种程度上,好的运气!