Я делаю игру на Android, и мне нужно выполнять определенные действия, когда пользователи пытаются долго нажимать на экран.К сожалению, я не нашел каких-либо методов, которые бы работали напрямую с пользовательским SurfaceView, не стесняйтесь сообщить мне, существует ли такой метод:)
Поэтому я решил попробовать реализовать обнаружение длинных прикосновений от слушателя событий onTouch.
вот мой код:
@Override
public boolean onTouch(View v, MotionEvent event)
{
long touchDuration = 0;
if ( event.getAction() == MotionEvent.ACTION_DOWN )
{
//Start timer
touchTime = System.currentTimeMillis();
}else if ( event.getAction() == MotionEvent.ACTION_UP )
{
//stop timer
touchDuration = System.currentTimeMillis() - touchTime;
if ( touchDuration < 800 )
{
onShortTouch(event,touchDuration);
}else
{
onLongTouch(event,touchDuration);
}
}
}
return true;
Это работает, но я могу определить, было ли нажатие долгим нажатием или нет, только когда пользователь перестает касаться телефона.Так что это не совсем то, что я хочу.Я бы предпочел, чтобы таймер запускался, когда пользователь впервые касается экрана, а затем по истечении 800 мс вызывается метод LongTouch ().Другими словами, я не хочу проверять, сколько времени прошло с момента ACTION_UP с момента ACTION_DOWN.Я считаю, что я должен использовать поток для указанного таймера, но я не могу заставить его работать.При использовании следующего кода сообщение отладки отображается, как только я касаюсь экрана:
@Override
public boolean onTouch(View v, MotionEvent event)
{
long touchDuration = 0;
TouchThread touchThread = new TouchThread();
if ( event.getAction() == MotionEvent.ACTION_DOWN )
{
//Start timer
touchTime = System.currentTimeMillis();
touchThread.setEvent(event);
touchThread.run();
}
return true;
}
private class TouchThread extends Thread
{
public MotionEvent event = null;
public void setEvent(MotionEvent e)
{
event = e;
}
@Override
public void run()
{
long startTime = System.currentTimeMillis();
long time = 0;
while(event.getAction() == MotionEvent.ACTION_DOWN)
{
time = System.currentTimeMillis() - startTime;
if( time > 800 )
{
System.out.println("LOOONG CLICK!!");
return;
}
}
}
}
У кого-нибудь есть идеи?Также будет приветствоваться другое решение.
Спасибо.