Я делаю игру на 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;
}
}
}
}
Кто-либо получил какую-либо идею? Другое решение также приветствовалось бы.
Спасибо.