MotionEvent从ACTION_UP更改为ACTION_DOWN

时间:2015-02-02 21:01:57

标签: android

在此代码中:

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

1 个答案:

答案 0 :(得分:2)

Android在这里进行一些内存优化。由于触摸事件在手势期间发生了很多 - 而不是每次MotionEvent发生时都创建onTouchEvent实例,Android会重复使用之前的MotionEvent实例,因此您不会污染堆内存。 / p>

由于您将引用存储到MotionEvent(ACTION_DOWN),因此每次调用ev1时,onTouchEvent都会更新。这就是为什么当ACTION_UP发生时 - 你的ev1等于最新的动作事件。它与ACTION_DOWN期间的实例相同。

您需要在MotionEvent期间存储xy坐标,而不是存储ACTION_DOWN个实例