You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

测量Android触摸事件时长:getEventTime()与currentTimeMillis()谁更高效?

两种触摸事件时间间隔测量方法的执行效率对比

结论很明确:第一种使用event.getEventTime()的方法,无论是执行效率还是测量准确性,都远优于第二种用System.currentTimeMillis()的方法。

为什么效率更高?

  • event.getEventTime()是直接读取MotionEvent对象内部已存储的时间戳,属于轻量的本地方法调用,几乎没有额外开销;
  • System.currentTimeMillis()需要调用系统底层的时间服务,涉及用户态与内核态的切换,每次调用都有明显的额外开销,虽然单次差异不大,但高频触发时(比如连续触摸)差距会被放大。

额外优势:准确性更可靠

除了效率,第一种方法的测量结果也更准确:

  • event.getEventTime()记录的是触摸事件实际发生的时间——系统在硬件捕获到触摸动作时就会给事件打上这个时间戳,和onTouchEvent的调度延迟无关;
  • System.currentTimeMillis()取的是代码执行到该行的时间,如果主线程因为其他任务(比如UI绘制、耗时操作)阻塞,onTouchEvent被延迟执行,这个时间会比实际触摸发生的时间晚,导致计算出的间隔出现偏差。

两种实现代码对比:

方法一(推荐)

public boolean onTouchEvent(MotionEvent event) {
    long msEventTime = event.getEventTime(); 

    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            msTouchDown = msEventTime;
            return true;
        case MotionEvent.ACTION_UP:
            msTouchUp = msEventTime;
            duration = msTouchUp - msTouchDown;
            return true;
    }
    return super.onTouchEvent(event);
}

注:原代码未获取事件动作,此处修正为event.getAction()以保证代码可运行。

方法二

public boolean onTouchEvent(MotionEvent event) {
    long msEventTime = System.currentTimeMillis(); 

    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            msTouchDown = msEventTime;
            return true;
        case MotionEvent.ACTION_UP:
            msTouchUp = msEventTime;
            duration = msTouchUp - msTouchDown;
            return true;
    }
    return super.onTouchEvent(event);
}

内容的提问来源于stack exchange,提问作者A.G.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 11:43:14