Может ли LongPress срабатывать после событий перемещения?

Я работаю над простым приложением для Android, мое требование,

"После некоторых событий перемещения (MotionEvent.ACTION_MOVE имеет значение true) на экране, если пользователь останавливается на несколько секунд, не снимая палец с экрана, необходимо выполнить какое-то действие".

* Я узнал, что LongPress - это то, что срабатывает, когда пользователь не делает никаких действий после срабатывания события down (MotionEvent.ACTION_DOWN).*

Так есть ли способ вызвать LongPress после перемещения по экрану?

Или я должен создать свой собственный слушатель для той же функциональности?

Любая помощь приветствуется.

Спасибо.

2 ответа

Решение

Идея состоит в том, чтобы cancel таймер каждый раз, когда вы двигаете пальцем на экране (MotionEvent.ACTION_MOVE). Когда вы через некоторое время перестанете двигаться, скажем, через 3 секунды, будет запущен код таймера, в котором вы можете выполнить долгое нажатие. Если вы останавливаетесь на некоторое время и снова начинаете движение до истечения времени (3 секунды), снова устанавливается новый таймер и так далее. Надеюсь, это поможет вам.

timer = new Timer();

public boolean onTouchEvent(MotionEvent event) 
{
    switch(event.getAction()) 
    {
        case MotionEvent.ACTION_DOWN:
             break;

        case MotionEvent.ACTION_MOVE:
             timer.cancel();
             timer = null;
             timer = new Timer();
             timer.schedule(new TimerTask() 
             {                  
                @Override
                public void run() {
                    // do your long press task here
                }
             }, 3000);
             break;

        case MotionEvent.ACTION_UP:
             timer.cancel();
             timer = null;
             break;
    }
    return super.onTouchEvent(event);
}

Боюсь, вам придется сделать это самостоятельно. Реализация по умолчанию - запуск события длинного нажатия, только если нет события Move

ключ должен использовать System.getCurrentTime() в onTouchEvent()

Как?

в onTouch()

  • искать событие Motion_DOWN,

    • примечание (установлено в long переменная) время касания события. (использование System.getCurrentTime())
    • установить логическое значение (скажем, isClicked к истине)
    • запустить задание таймера, которое будет выполнено через x миллисекунд (где x - длительность вашего longClick), если isClicked все еще правда. Думайте об этом как о своем слушателе onLongClick

-

  • на событие Motion_UP
    • установить isClicked как false.

РЕДАКТИРОВАТЬ: я пропустил один важный шаг:

  • на событие Motion_MOVE
    • перезапустите задачу таймера (т.е. отмена + запуск)
Другие вопросы по тегам