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ş
相关产品推荐
相关产品推荐

