2011-05-25 43 views
1

UPDATE: 所以我想通了,这是因为之后我把它传递给线程的MotionEvent变更后,该解决方案是这样的:举止怪异的触摸事件

/** 
* Standard override to get touch screen motion events. 
*/ 
@Override 
public boolean onTouchEvent(MotionEvent event) { 
    MotionEvent passMe = MotionEvent.obtain(event); 
    event.recycle(); 
    return thread.doTouchEvent(passMe); 
} 

但不知何故,我结束了事件和具有相同MotionEvent ID的passMe,出于某种原因,不会创建新的MotionEvent。

我做错了什么? :(

--- VVV OLD VVV ---

我开发一个Android应用程序,我这里有这个代码,增加了动作类型ACTION_DOWN的任何触摸输入队列:

/** Adds the touch event to the motionEventQueue for processing. */ 
public boolean doTouchEvent(MotionEvent event) { 
    //Only add the MotionEvent to the queue if we care about that kind of action. 
    if (event.getAction() == MotionEvent.ACTION_DOWN) { 
     motionEventQueue.add(event); 
    } 

    return true; 
} 

的问题是,这里的代码应该确保只有动作类型ACTION_DOWN的MotionEvents进入队列,但不知何故,我结束了同类型ACTION_UP的MotionEvents和其他人的队列里。

这是怎么回事看着调试器,它出现了在他们被添加到队列时,他们的类型是ACTION_DOWN,但是当它处理队列时,动作类型似乎已经发生了某种变化。

编辑:这里是我的onTouchEvent方法:

/** 
* Standard override to get touch screen motion events. 
*/ 
@Override 
public boolean onTouchEvent(MotionEvent event) { 
    return thread.doTouchEvent(event); 
} 

编辑:是否有与事实,我使用一个以上的线程呢?它是不同步还是什么?

+0

你是否在事件中调用了recycle()? – 2011-05-25 21:55:40

+0

这是方法的名称吗?我可以找到SDK中没有的“doTouchEvent”。除此之外,我的“onTouchEvent”方法的结构与您的示例类似,并且在SDK 2.2和2.3中似乎工作正常。另外,您是否确定“motionEventQueue”未添加到其他位置? – 2011-05-25 21:59:59

+0

doTouchEvent只是视图中的onTouchEvent告诉线程执行的线程内部的方法。 另外我不打电话回收()的事件,是我应该? – 2011-05-25 22:35:25

回答

3

活动回收。您传递了对该事件的引用,并且正在为您的队列添加引用。该活动将被回收,因此您的参考指向使用旧活动回收的新活动。如果你幸运的话。

在执行onTouchEvent完成后,您不应该使用该事件。如果您需要持久存储一些数据,请将其复制到您自己的结构中(或者克隆事件,如果可能的话)。

至于你的其他问题 - 只有UI线程处理触摸事件,所以有多个线程应该没有关系(除非你使用那些其他线程鱼雷你的队列)。

+1

就是这样啊!谢谢(你的)信息。此外,您可以使用MotionEvent.obtain(event)克隆MotionEvent,它会根据事件返回新的MotionEvent。 – 2011-05-26 04:25:00

+0

实际上不知何故,新的MotionEvent以旧ID结尾...... – 2011-05-26 04:40:58

+0

我不会回收传入的事件。将其留给框架。 – EboMike 2011-05-27 04:18:07