java在交换机/机箱中添加等待?
当用户单击时,case MotionEvent。触发了“下一步”操作。释放单击时,case MotionEvent。触发了动作_UP
我感兴趣的是确定动作停止后3秒内是否没有触发动作停止。也就是说,如果用户点击后已经过了3秒,但还没有发布,我想知道,基本上是试图确定长时间点击
有没有办法做这样的事
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
break;
case MotionEvent.ACTION_UP:
break;
}
# 1 楼答案
通常,检测长时间单击的正确方法是 View.OnLongClickListener。这比自己检测更容易,也不容易出错,而且可以确保你的应用程序与系统的其余部分很好地配合
对于自定义
View
,您需要将implements View.OnLongClickListener
添加到类声明中,将setOnLongClickListener(this);
添加到构造函数中,并将onLongClick()
方法添加到类中:如果您的
View
不是自定义的,您可以这样添加侦听器:更新:好的,我已经做了一些挖掘,虽然这是我处理过的每个视图的正确方法,但实际上它不适用于SeekBars,这正是提问者正在处理的。这一事实没有在
SeekBar
文档中记录,但实验已经证明它是正确的,通过对源代码的深入研究可以看出:SeekBar.onTouchEvent()
不调用super.onTouchEvent()
的原因。如果合适的话,就是在View.onTouchEvent()
中调用performLongClick()
如果必须的话,我实现它的方式是使用
Handler.postDelayed()
。在ACTION_DOWN上,我会发布一个Runnable
(延迟3000ms)来处理对aHandler
的长按,我会在ACTION_UP上取消它。因此,任何小于延迟的按下操作都不会调用Runnable
,但如果延迟后没有发生动作,则会调用也就是说,我要提醒你重新考虑这样做。长按a
SeekBar
意味着什么?如果用户拖动“拇指”的时间超过了延迟时间,那么突然之间,您会长按一次,而这可能并不意味着一次长按。每次移动拇指时,您都可以取消并重置延迟,需要长按几秒钟才能在一个位置。但完全静止是很少见的;事实上,握住拇指几秒钟都不动是很困难的。因此,拇指位置的最小变化可以重置延迟。如果有必要,我会这么做,但我必须说这是一种非常奇怪的用户体验# 2 楼答案
它简单明了。您需要获得时间戳来评估事件之间的时间差,您可以通过以下示例进行评估:
然而,正如@Darshan Computing所说的,您最好使用
View.OnLongClickListener
,这是一种无麻烦的方法# 3 楼答案
当用户单击时,启动一个轮询按钮当前状态的新线程(或引入一个在
DOWN
中设置并在UP
中重置的新标志)。该线程可以每100ms轮询一次此状态或标志,并使用内部时间戳来确定是否已过3秒。如果是这样,它可以触发一个新事件以启动长时间单击的操作