java - 触摸事件行为异常

标签 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);
}

但不知何故我最终得到了 event 和 passMe 具有相同的 MotionEvent id,由于某种原因没有创建新的 MotionEvent。

我做错了什么? :(

---vvv 旧 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 类型为 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);
}

编辑:这是否与我使用多个线程这一事实有关?是不同步还是什么?

最佳答案

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

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

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

关于java - 触摸事件行为异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6131172/

相关文章:

android - 在 linux 中启动一个 ionic 项目

java - Android - 所有数据库操作都应该在一个线程中完成吗?

java - ScrollTo 不适用于 Appium for Android

java - 阻止跨平台性的东西你的 java web 应用程序

java - 如何获取 java 文件中的变量并将其连接到 XML 文件

java - 封装到底是什么?

java - Android AccessibilityService onGesture() 正在禁用触摸

Java Runtime.getRuntime().exec() 似乎正在覆盖 $PATH

android - 如何在 Android 版 Facebook 登录按钮上添加自定义文本并设置自定义图像?

java - 如何在 Android 中创建固定操作栏并在其下方启动新 Activity