Обработка касания экрана: остановка при MotionEvent.ACTION_MOVE

Есть рабочий кусок обработки касания. Основные задачи:

  1. обработка при движении
  2. обработка при отпускании пальца с экрана

Если нажать на экран, но не двигать пальцем - ничего не произойдет. Так и надо. НО если подвигать пальцем, а потом остановится, то будет продолжать работать часть MotionEvent.ACTION_MOVE, а я этого не хочу.

Как заставить MotionEvent.ACTION_MOVE не работать при "простое" пальца?
А если точнее, "как обработать момент, когда палец остановился, но еще не убран с экрана?"

web.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {


                switch (event.getAction()) {

                    case MotionEvent.ACTION_DOWN: // нажатие
                        break;

                    case MotionEvent.ACTION_MOVE: // движение
                    // код для движения
                        break;


                    case MotionEvent.ACTION_UP: // отпускание
                    case MotionEvent.ACTION_CANCEL:
                    // код для отпускания                      
                        break;
                        
                }
                return false;
            }
        });

UP for @ВасяВоронцов
Вот Ваш пример. Если двигать пальцем только по горизонтали / вертикали экрана - всегда будет показываться "стоп". А если по диагонали экрана, то будет только "движение", даже когда палец остановлен.

case MotionEvent.ACTION_DOWN: // нажатие

                        a = event.getX(); //Назначим точки
                        b = event.getY();
                        break;

                    case MotionEvent.ACTION_MOVE: // движение

                        if (a != event.getX() && b != event.getY()) {
                            Log.e("sdfg", "движение");
                        } else {
                            Log.e("sdfg", "стоп");
                        }
                        a = event.getX(); //Обновим точки
                        b = event.getY();

Ответы (1 шт):

Автор решения: Вася Воронцов

Что значит "простой" пальца? Это значит, что координаты точки касания не меняются. Так и напишем.

web.setOnTouchListener(new View.OnTouchListener() {
    float x, y;

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN: // нажатие
                x = event.getX(); //Назначим точки
                y = event.getY();
                break;
            case MotionEvent.ACTION_MOVE: // движение
                if (x != event.getX() && y != event.getY()) {
                    // код для движения
                };
                x = event.getX(); //Обновим точки
                y = event.getY();
                break;
            case MotionEvent.ACTION_UP: // отпускание
            case MotionEvent.ACTION_CANCEL:
                    // код для отпускания                      
                break;
        }
        return true;
    }
});

Если координаты точки касания не изменились после последнего события движения, то палец покоится.

UPD

Не знаю, почему это работает с кнопкой. Когда вы касаетесь экрана, срабатывает событие ACTION_DOWN, но метод onTouch возвращает false, поэтому дальнейшего отслеживания действия не происходит. Звмена возвращаемого значения на true решает проблему.

Но перестанет работать анимация на кнопке

→ Ссылка