Measure elapsed time between two MotionEvents in Android

10,042

Solution 1

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
    }
}

Solution 2

A MotionEvent has a timestamp. Use getEventTime() to access it.

In fact, since there is no guarantee that the MotionEvent is delivered immediately to your code, this timestamp is more accurate than any times you get from System.getCurrentTimeMillis().

Share:
10,042
Matey
Author by

Matey

Updated on June 14, 2022

Comments

  • Matey
    Matey almost 2 years

    I'm new in Android programming so I am asking for your help in my problem. I am trying to measure in seconds/milliseconds the amount of time between a MouseEvent.ACTION_DOWN and MouseEvent.ACTION_UP.

    @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
    

    My problem consist in fact that seconds variable doesn't show what I want, I even don't know if its measuring correctly.For the above example duration was 16545 (???!?!?) but it should have been between 1-3 seconds.What shall I do to measure correctly in seconds or milliseconds the time between two MotionEvents or what am I wrong in my example ? Thank you !