2015-02-02 3 views
0

В этом коде:MotionEvent изменяется от ACTION_UP к ACTION_DOWN

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 к первому «если», код в нем пропущен. Почему это происходит?

Если вы хотите знать, почему я использую этот подход, чтобы заменить onFling() увидеть это: onFling not being called in a costum View

+0

что? я единственный, кто не понимает, что было задано? –

+0

@Pavel Dudka, Извините, вы сейчас это понимаете? Я пытаюсь подражать работе 'onFling()' – EmmanuelMess

ответ

2

Android делает некоторую оптимизацию памяти здесь. Так как события касания случаются очень много во время жестов - вместо создания экземпляра MotionEvent каждый раз, когда происходит onTouchEvent, Android повторно использует предыдущий экземпляр MotionEvent, поэтому вы не загрязняете свою кучную память.

Поскольку вы храните ссылку на MotionEvent (ACTION_DOWN) в своем случае - ваш ev1 обновляется каждый раз, когда вызывается onTouchEvent. Поэтому, когда происходит ACTION_UP - ваш ev1 соответствует последнему событию движения. Это тот же экземпляр, что и во время ACTION_DOWN.

Вместо того чтобы хранить MotionEvent экземпляр - вам нужно хранить x и y координаты во ACTION_DOWN

Смежные вопросы