在此代码中:
private static MotionEvent e1;
private static float start;
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getActionMasked() == MotionEvent.ACTION_UP) {
MotionEvent e2 = event;
float velocityX = Math.abs((e1.getX() - e2.getX()) / start);
float velocityY = Math.abs((e1.getY() - e2.getY()) / start);
onFling(e1, event, velocityX, velocityY);//BREAKPOINT 2
} else if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
e1 = event;
start = System.currentTimeMillis() / 1000;//BREAKPOINT 1
}
return Game.onTouchEvent(event);
}
如果我在" BREAKPOINT 1"我明白了:e1.getActionMasked()
等于ACTION_DOWN
。但当它停在" BREAKPOINT 2"我得到e1
等于event
。如果我将&& event != e1
添加到第一个" if"它中的代码被跳过。为什么会发生这种情况?
如果您想知道我使用此方法替换onFling()
的原因,请参阅:onFling not being called in a costum View
答案 0 :(得分:2)
Android在这里进行一些内存优化。由于触摸事件在手势期间发生了很多 - 而不是每次MotionEvent
发生时都创建onTouchEvent
实例,Android会重复使用之前的MotionEvent
实例,因此您不会污染堆内存。 / p>
由于您将引用存储到MotionEvent
(ACTION_DOWN),因此每次调用ev1
时,onTouchEvent
都会更新。这就是为什么当ACTION_UP
发生时 - 你的ev1
等于最新的动作事件。它与ACTION_DOWN
期间的实例相同。
您需要在MotionEvent
期间存储x
和y
坐标,而不是存储ACTION_DOWN
个实例