2012-03-19 4 views
7

Я новичок в программировании на Android, поэтому я прошу вас о помощи в моей проблеме. Я пытаюсь измерить в секундах/миллисекундах время между MouseEvent.ACTION_DOWN и MouseEvent.ACTION_UP.Измерение прошедшего времени между двумя MotionEvents в 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 

Моя проблема состоит в том, что переменная секунд не показывает, что я хочу, я даже не знаю, если его измерения correctly.For вышеприведенном например длительность была 16545 (???! ????), но он должен был быть между 1-3 секунд. Что делать, чтобы правильно измерить секунды или миллисекунд время между двумя MotionEvents или что я ошибаюсь в моем примере? Спасибо !

ответ

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

Спасибо, глядя на ваш код, который я обнаружил свою ошибку: переменная давно начала должна быть объявлена ​​глобальной, а не локальный в моей функции, большое спасибо! – Matey

+3

Вы должны использовать 'System.nanoTime()' вместо 'System.currentTimeMillis()'. Пожалуйста, прочитайте javadoc для обеих функций, говорится, что 'currentTimeMillis()' не следует использовать для измерения интервалов, потому что он может быть скорректирован во время выполнения. – keaukraine

+0

Спасибо keaukraine, добавлены изменения для использования nanoTime() –

8

MotionEvent имеет метку времени. Для доступа к нему используйте getEventTime().

На самом деле, так как нет гарантии, что MotionEvent будет доставлен непосредственно вашему коду, эта метка времени более точна, чем когда-либо, когда вы получаете от System.getCurrentTimeMillis().

+1

+1 Это, используемый с 'android.os.SystemClock.uptimeMillis()', на самом деле является правильным решением для поиска времени между событиями «вниз» и «вверх». –

0

Вот решение описывается @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 
    } 
}