2012-03-19 17 views
7

Sono nuovo nella programmazione Android, quindi ti sto chiedendo aiuto per il mio problema. Sto provando a misurare in secondi/millisecondi la quantità di tempo tra un MouseEvent.ACTION_DOWN e MouseEvent.ACTION_UP.Misura il tempo trascorso tra due MotionEvents in 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 

Il mio problema consiste nel fatto che la variabile secondi non mostra quello che voglio, anche se non so se la sua misurazione correctly.For quanto sopra esempio la durata era 16545 (???! ?!?) ma avrebbe dovuto essere tra 1-3 secondi. Cosa devo fare per misurare correttamente in secondi o millisecondi l'intervallo di tempo tra due MotionEvents o cosa ho sbagliato nel mio esempio ? Grazie !

risposta

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

Grazie, guardando il codice ho scoperto la mia colpa: lunga lunghezza variabile deve essere dichiarata globale, non locale nella mia funzione, grazie mille! – Matey

+3

Dovresti usare 'System.nanoTime()' invece di 'System.currentTimeMillis()'. Si prega di leggere javadoc per entrambe le funzioni, si dice che 'currentTimeMillis()' non dovrebbe essere usato per misurare gli intervalli perché potrebbe essere regolato in fase di esecuzione. – keaukraine

+0

Grazie keaukraine, modifiche accomodate per utilizzare nanoTime() –

8

Un MotionEvent ha un timestamp. Utilizzare getEventTime() per accedervi.

In effetti, poiché non vi è alcuna garanzia che il codice MotionEvent venga consegnato immediatamente al codice, questo timestamp è più preciso di ogni volta che si ottiene da System.getCurrentTimeMillis().

+1

+1 Questo, usato con 'android.os.SystemClock.uptimeMillis()' è in realtà la soluzione corretta per trovare il tempo tra gli eventi down e up. –

0

Ecco la soluzione descritta da @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 
    } 
} 
Problemi correlati