Может ли 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
- перезапустите задачу таймера (т.е. отмена + запуск)