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