Измерение интервала времени между двумя MotionEvents в Android
Я новичок в Android программирование, поэтому я прошу вашей помощи в моей проблеме. Я пытаюсь измерить в секундах / миллисекундах количество времени между MouseEvent.ACTION_DOWN и MouseEvent.Выполняется.
@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
моя проблема заключается в том, что переменная секунд не показывает, что я хочу, я даже не знаю, правильно ли его измеряют.Выше продолжительность примера была 16545 (???!?!?) но это должно было быть между 1-3 секунд.Что мне делать в меру правильно в секундах или миллисекундах промежуток времени между двумя MotionEvents или что я ошибаюсь в мой пример ? Спасибо !
3 ответов
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
}
}
A MotionEvent
имеет отметку времени. Использовать getEventTime()
для доступа к нему.
на самом деле, так как нет никакой гарантии, что MotionEvent
немедленно доставляется в ваш код, эта временная метка более точна, чем в любое время, когда вы получаете от System.getCurrentTimeMillis()
.
вот решение, описанное @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
}
}