Je fais un jeu sur Android et je dois faire certaines actions lorsque les utilisateurs tentent un appui long sur l'écran. Malheureusement, je n'ai trouvé aucune méthode qui fonctionne directement avec un SurfaceView personnalisé, n'hésitez pas à me dire si une telle méthode existe :)Long Touch sur un SurfaceView (android)
J'ai donc décidé d'essayer de mettre en œuvre une détection longue durée depuis l'écouteur d'événement onTouch.
voici mon code:
@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;
Cela fonctionne, mais je peux détecter si la presse était un long ou non seulement lorsque l'utilisateur cesse de toucher au téléphone. Donc ce n'est pas exactement ce que je veux. Je préférerais qu'une minuterie démarre lorsque l'utilisateur touche l'écran pour la première fois, puis une fois que 800 ms se sont écoulés, la méthode LongTouch() est appelée. En d'autres termes, je ne veux pas avoir à vérifier combien de temps s'est écoulé quand ACTION_UP depuis ACTION_DOWN. Je crois que je devrais utiliser un fil pour le dit minuteur mais je ne peux pas le faire fonctionner. Lorsque vous utilisez le code suivant, le message de débogage est affiché dès que je touche l'écran:
@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;
}
}
}
}
Quelqu'un at-il une idée? Une autre solution serait également la bienvenue.
Merci.