Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否在交换机/机箱中添加等待?_Java_Android - Fatal编程技术网

Java 是否在交换机/机箱中添加等待?

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;

当用户单击时,会触发case MotionEvent.ACTION\u DOWN。释放单击时,将触发case MotionEvent.ACTION\u UP

我感兴趣的是确定动作停止后3秒内是否没有触发动作停止。也就是说,如果用户点击后已经过了3秒,但还没有发布,我想知道,基本上是试图确定长时间点击

有没有办法做这样的事

   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
,这是一种无麻烦的方法。

通常检测长点击的正确方法是通过实现 . 这比自己检测更容易,也不容易出错,而且可以确保你的应用程序与系统的其余部分很好地配合

对于自定义的
视图
,您需要将
实现视图添加到类声明中添加到构造函数中,并将
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
发布到动作结束时,我会取消它。因此,任何小于延迟的按键都不会调用
可运行
,但如果延迟后没有发生动作,则会调用


也就是说,我要提醒你重新考虑这样做。长按a
SeekBar
意味着什么?如果用户拖动“拇指”的时间超过了延迟时间,那么突然之间,您会长按一次,而这可能并不意味着一次长按。每次移动拇指时,您都可以取消并重置延迟,需要长按几秒钟才能在一个位置。但完全静止是很少见的;事实上,握住拇指几秒钟都不动是很困难的。因此,拇指位置的最小变化可以重置延迟。如果有必要,我会这么做,但我必须说这是一种非常奇怪的用户体验。

通常,检测长时间点击的正确方法是实现 . 这比自己检测更容易,也不容易出错,而且可以确保你的应用程序与系统的其余部分很好地配合

对于自定义的
视图
,您需要将
实现视图添加到类声明中添加到构造函数中,并将
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
发布到动作结束时,我会取消它。因此,任何小于延迟的按键都不会调用
可运行
,但如果延迟后没有发生动作,则会调用


也就是说,我要提醒你重新考虑这样做。长按a
SeekBar
意味着什么?如果用户拖动“拇指”的时间超过了延迟时间,那么突然之间,您会长按一次,而这可能并不意味着一次长按。每次移动拇指时,您都可以取消并重置延迟,需要长按几秒钟才能在一个位置。但完全静止是很少见的;事实上,握住拇指几秒钟都不动是很困难的。因此,拇指位置的最小变化可以重置延迟。如果有必要,我会这么做,但我必须说这是一种非常奇怪的用户体验。

当用户单击后,启动一个新线程,轮询按钮的当前状态(或者引入一个新的标志,该标志在
向下
中设置,并在
向上
中重置。线程可以每100ms轮询一次该状态或标志,并使用内部时间戳确定是否已过3秒。如果是这样,则可以在用户单击时触发一个新事件以长时间单击开始操作,启动一个轮询当前的新线程t按钮的状态(或引入在中设置的新标志