如何解决触摸事件行为异常
| 更新: 所以我发现这是因为在将MotionEvent传递给线程后,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,因此我最终得到具有相同MotionEvent id的event和passMe。
我做错了什么? :(
--- 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_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线程可以处理触摸事件,因此拥有多个线程无关紧要(除非您当然使用其他线程来破坏队列)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。