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

Android/Kotlin开发中onKeyDown方法未触发 无法计算触屏时长问题求助

问题解决

核心问题:你错误使用了按键事件回调处理触摸逻辑,onKeyDown、onKeyUp仅响应实体按键(如音量键、电源键、实体键盘按键)事件,屏幕触摸操作不会触发这两个回调,自然拿不到正确的开始时间。


解决方案

方案1:重写Activity的onTouchEvent监听全局屏幕触摸

如果需要统计整个Activity范围内的触摸时长,直接重写该方法即可:

override fun onTouchEvent(event: MotionEvent?): Boolean {
    when (event?.action) {
        // 手指按下屏幕
        MotionEvent.ACTION_DOWN -> {
            isKeyPressed = true
            startTime = System.currentTimeMillis()
            // 返回true表示消费当前触摸事件,后续触摸事件会继续回调到该方法
            return true
        }
        // 手指离开屏幕
        MotionEvent.ACTION_UP -> {
            isKeyPressed = false
            endTime = System.currentTimeMillis()
            val touchDuration = endTime - startTime
            // 此处可以直接使用统计到的触摸时长,单位为毫秒
            return true
        }
    }
    return super.onTouchEvent(event)
}

方案2:监听特定View的触摸时长

如果只需要统计某个指定控件的触摸时长,给对应View设置OnTouchListener即可:

// 示例:给id为targetView的控件设置触摸监听
targetView.setOnTouchListener { v, event ->
    when (event.action) {
        MotionEvent.ACTION_DOWN -> {
            isKeyPressed = true
            startTime = System.currentTimeMillis()
            true
        }
        MotionEvent.ACTION_UP -> {
            isKeyPressed = false
            val touchDuration = System.currentTimeMillis() - startTime
            // 此处处理触摸时长逻辑
            true
        }
        else -> false
    }
}

注意事项

  • 如果触摸过程中可能出现滑动、手指移出控件范围的场景,可以额外处理MotionEvent.ACTION_CANCEL事件,避免时长统计异常
  • 若目标View本身设置了onClickListener,注意OnTouchListener的返回值:返回true会消费事件,不会触发点击回调;如果需要保留原点击逻辑,非必要事件返回false即可
  • 你原有代码中用于处理按键的onKeyDown、onKeyUp和触摸统计逻辑无关,可以直接删除

内容的提问来源于stack exchange,提问作者Özgür Ulaş

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 12:18:04