2012-03-19 5 views
7

Je suis nouveau dans la programmation Android alors je demande votre aide pour mon problème. J'essaie de mesurer en secondes/millisecondes la durée entre un événement MouseEvent.ACTION_DOWN et un événement MouseEvent.ACTION_UP.Mesurez le temps écoulé entre deux MotionEvents dans Android

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    long start=0; 
    if (event.getAction() == MotionEvent.ACTION_DOWN) { 
     // manage down press 
     start=System.nanoTime();//START 
     System.out.println("START"); 
    } 
    else if (event.getAction() == MotionEvent.ACTION_MOVE) { 
     // manage move 
     System.out.println(event.getRawX()+","+event.getRawY()); 
    } 
    else { 
     // manage up 
     long finish=System.nanoTime()//FINISH 
     long seconds = (finish-start)/1000000000;//for seconds 
     Toast.makeText(this, "FINISH, duration: "+seconds, Toast.LENGTH_SHORT).show(); 
     System.out.println("FINISH, duration: "+seconds); 
    } 
    return true; 
} 




Logcat: 
03-19 04:04:27.140: I/System.out(4348): START 
03-19 04:04:27.160: I/System.out(4348): 517.0,280.0 
03-19 04:04:27.190: I/System.out(4348): 517.0,280.0 
03-19 04:04:27.200: I/System.out(4348): 517.0,280.0 
03-19 04:04:27.220: I/System.out(4348): 517.0,280.0 
03-19 04:04:27.250: I/System.out(4348): 517.0,280.0 
03-19 04:04:27.260: I/System.out(4348): 517.0,280.0 
03-19 04:04:27.300: I/System.out(4348): 517.0,280.0 
03-19 04:04:27.310: I/System.out(4348): 517.0,280.0 
03-19 04:04:27.330: I/System.out(4348): FINISH, duration: 16545 

Mon problème consiste, en fait, cette variable secondes ne montre pas ce que je veux , je ne sais même pas si sa mesure correctly.For la durée exemple ci-dessus était 16545 (???! ?!?) mais il aurait dû être entre 1-3 secondes.Que dois-je faire pour mesurer correctement en secondes ou millisecondes le temps entre deux MotionEvents ou ce que je me trompe dans mon exemple? Je vous remercie !

Répondre

11
long startTime; 
public boolean onTouchEvent(MotionEvent event) { 

    if (event.getAction() == MotionEvent.ACTION_DOWN) 
     startTime = System.nanoTime();  

    else if (event.getAction() == MotionEvent.ACTION_UP) { 
     long elapseTime = System.nanoTime() - startTime; 
     //do whatever u want with elapseTime now, its in nanoseconds 
    } 
} 
+0

Merci, regardant votre code j'ai découvert ma faute: démarrage trop long variable doit être déclarée mondiale, et non locale dans ma fonction, je vous remercie beaucoup! – Matey

+3

Vous devriez utiliser 'System.nanoTime()' au lieu de 'System.currentTimeMillis()'. Veuillez lire javadoc pour les deux fonctions, il est dit que 'currentTimeMillis()' ne devrait pas être utilisé pour mesurer les intervalles car il pourrait être ajusté au moment de l'exécution. – keaukraine

+0

Merci keaukraine, changements accommodés pour utiliser nanoTime() –

8

A MotionEvent a un horodatage. Utilisez getEventTime() pour y accéder. En fait, comme il n'y a aucune garantie que le MotionEvent est livré immédiatement à votre code, cet horodatage est plus précis que les fois que vous obtenez de System.getCurrentTimeMillis().

+1

+1 Ceci, utilisé avec 'android.os.SystemClock.uptimeMillis()' est en fait la bonne solution pour trouver le temps entre les événements down et up. –

0

Voici la solution décrite par @CvR:

private long startTimeInMilliSec; 
@Override 
public boolean onTouchEvent(MotionEvent event) { 

    if (event.getAction() == MotionEvent.ACTION_DOWN) 
     startTimeInMilliSec = event.getEventTime();  

    else if (event.getAction() == MotionEvent.ACTION_UP) { 
     long elapsedTime = event.getEventTime() - startTimeInMilliSec; 
     //do whatever u want with elapsedTime now, its in milliseconds 
    } 
} 
Questions connexes