Измерение прошедшего времени между двумя событиями MotionEvents в Android - PullRequest
7 голосов
/ 19 марта 2012

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

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

Ответы [ 4 ]

11 голосов
/ 19 марта 2012
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
    }
}
8 голосов
/ 02 апреля 2013

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

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

0 голосов
/ 04 февраля 2019

Каждое событие также имеет getDownTime() метод.Поэтому, когда вы получили MotionEvent.ACTION_UP, вы можете просто использовать

event.getDownTime() - event.getEventTime()

для расчета прошедшего времени.

0 голосов
/ 07 июля 2016

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