Android: 如何检测交互时未触屏1秒?

Android: How to detect an untouch screen for 1 second while interacting?

我正在使用原生 Android 构建一个互动游戏。 我想要的功能之一是监听触摸事件并在屏幕未触摸给定时间时触发一些动画:比如说一秒钟。

我的方法是在 ViewModel 中使用 CountDownTimer 来测量动作前的时间。

看起来如下:

private var _timeBeforeAction = MutableLiveData<Long>()
    // Countdown time
val timeBeforeAction: LiveData<Long> = _timeBeforeAction

val timerToAction = object : CountDownTimer(5*ONE_SECOND, ONE_SECOND) {

    override fun onTick(millisUntilFinished: Long) {
        _timeBeforeAction.value = millisUntilFinished/ONE_SECOND
    }

    override fun onFinish() {
    }
}

该片段具有监听触摸事件的自定义视图:

if (event.action == MotionEvent.ACTION_DOWN) {    
    // do things
}
if(event.action == MotionEvent.ACTION_MOVE) {
    // do things
}
if (event.action == MotionEvent.ACTION_UP && pointerId==0){  
    binding.viewmodel!!.timerToAction.start()
    binding.viewmodel!!.timeBeforeAction.observe(viewLifecycleOwner, Observer {
                                timer ->
    if (timer==0L){
    // launch animation
    }
})

问题是,每当检测到事件 ACTION_UP 时,除了之前启动的计时器之外,还会启动一个新的计时器,因此动画会多次启动。

我试图用一个简单的按钮触发计时器启动来复制此行为,但在那种情况下它没有出现。

在您看来,当屏幕在给定时间内保持不动时触发动画的最佳方式是什么

恕我直言,最简单的算法是:

  1. 保存屏幕触摸时的最后触摸时间值(系统时间)(在 ACTION_UP 事件上)并将“播放一次”设置为 false

  2. 在游戏循环或计时器的每个 frame/tick 中,通过从当前系统时间中减去上次触摸时间来检查经过的时间。

  3. 如果 1 秒过去并且“播放一次”标志为 false,则启动动画并将“播放一次”标志设置为 true