触摸奇怪的事件

时间:2011-05-25 21:27:51

标签: java android

更新: 所以我发现这是因为在我将它传递给线程之后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);
}

但不知怎的,我最终得到的事件和passMe具有相同的MotionEvent id,由于某种原因,没有创建新的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的MotionEvent进入队列,但不知何故,我最终会得到ACTION_UP类型的MotionEvents和队列中的其他动作。

为什么会这样?看一下调试器,当它们被添加到队列时,它们的类型为ACTION_DOWN,但是当需要处理队列时,动作类型似乎已经以某种方式发生了变化。

编辑:这是我的onTouchEvent方法:

/**
* Standard override to get touch screen motion events.
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
    return thread.doTouchEvent(event);
}
编辑:是否与我使用多个线程的事实有关?是不同步还是什么?

1 个答案:

答案 0 :(得分:3)

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

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

至于你的另一个问题 - 只有UI线程处理触摸事件,因此拥有多个线程无关紧要(除非你使用其他线程来破坏你的队列)。