在Android中测量两个MotionEvents之间的经过时间

7

我是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个回答

12

一个 MotionEvent 包含时间戳。使用 getEventTime() 访问它。

实际上,因为不能保证 MotionEvent 立即传递到您的代码,所以此时间戳比您从 System.getCurrentTimeMillis() 获取的任何时间更准确。


1
+1 这个方法与 android.os.SystemClock.uptimeMillis() 结合使用,实际上是找到按下和释放事件之间时间的正确解决方案。 - Nick Hartung

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

谢谢,看了你的代码后我发现了我的错误:变量long start应该在我的函数中声明为全局变量而不是局部变量,非常感谢! - Matey
3
еә”иҜҘдҪҝз”ЁSystem.nanoTime()д»ЈжӣҝSystem.currentTimeMillis()гҖӮиҜ·йҳ…иҜ»дёӨдёӘеҮҪж•°зҡ„javadocпјҢе…¶дёӯжҸҗеҲ°currentTimeMillis()дёҚеә”з”ЁдәҺжөӢйҮҸж—¶й—ҙй—ҙйҡ”пјҢеӣ дёәе®ғеҸҜиғҪеңЁиҝҗиЎҢж—¶иў«и°ғж•ҙгҖӮ - keaukraine
感谢keaukraine,适应了使用nanoTime()的更改。 - Rahul garg
这个答案有问题 - 它只会标记事件被处理的时间,而不是生成的时间 - 因此它取决于诸如线程争用之类的因素,可能会出现严重偏差。 CvR的回答展示了获取时间戳的正确方法 - 使用 MotionEvent.getEventTime() (内部使用System.nanoTime()),但是在事件生成时进行。 - Peter

1
这是@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 
    } 
} 

1
每个事件都有一个getDownTime()方法。因此,当您收到MotionEvent.ACTION_UP时,您可以简单地使用event.getDownTime() - event.getEventTime()来计算经过的时间。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接