在我的应用程序中,我试图让粒子从可能的多个触摸位置发射。
我有一个用于存储点和关联计时器的类:
在 onTouchEvent 方法中,如果 MotionEvent.ACTION_POINTER_DOWN 触发,我会创建一个新的 Touch 实例:
将其存储在地图中,使用touch id作为键。
如果触发了MotionEvent.ACTION_POINTER_UP,我会通过在计时器上调用cancel()并从地图中删除它来删除触摸。
最后,如果事件的类型为MotionEvent.ACTION_MOVE,我只需迭代地图中所有Touch实例并更新矢量坐标即可。
这个方法起作用,但有时计时器不会被正确删除,有时它们保持活动状态却什么也不做,有时即使我停止触摸屏幕,它们仍会继续发射粒子。
我该如何使这段代码更加健壮,以便始终能正确运行?
编辑1:ACTION_POINTER_UP的代码
我调用这个方法。
我有一个用于存储点和关联计时器的类:
private static class Touch
{
public Timer timer = new Timer();
public vec position = new vec();
}
在 onTouchEvent 方法中,如果 MotionEvent.ACTION_POINTER_DOWN 触发,我会创建一个新的 Touch 实例:
Touch t = new Touch();
t.position = new vec(event.getX(id), event.getY(id));
t.timer.scheduleAtFixedRate(new TimeredTouchTask(t.position, id), 0, SHOOTING_INTERVAL);
将其存储在地图中,使用touch id作为键。
如果触发了MotionEvent.ACTION_POINTER_UP,我会通过在计时器上调用cancel()并从地图中删除它来删除触摸。
最后,如果事件的类型为MotionEvent.ACTION_MOVE,我只需迭代地图中所有Touch实例并更新矢量坐标即可。
这个方法起作用,但有时计时器不会被正确删除,有时它们保持活动状态却什么也不做,有时即使我停止触摸屏幕,它们仍会继续发射粒子。
我该如何使这段代码更加健壮,以便始终能正确运行?
编辑1:ACTION_POINTER_UP的代码
我调用这个方法。
private void removeTouch(int id)
{
Touch t = _touch.get(id);
if(t != null)
{
if(t.timer != null)
{
t.timer.cancel();
t.timer = null;
}
t = null;
_touch.remove(id);
}
}
编辑2:完整列表链接
通过检查一些日志,我发现例如:
触摸手指#1 触摸手指#2 触摸手指#3 释放手指#3 释放手指#2 释放手指#1
是可以的,但是执行以下操作:
触摸手指#1 触摸手指#2 触摸手指#3 释放手指#1 释放手指#2 释放手指#3
会泄漏最后一个定时器。 我认为我肯定在处理ID和索引。