Measure elapsed time between two MotionEvents in Android
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()
.
Matey
Updated on June 14, 2022Comments
-
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 !