0

当用户单击时,将触发 case MotionEvent.ACTION_DOWN。当点击被释放时,case MotionEvent.ACTION_UP 被触发。

我有兴趣确定 ACTION_UP 是否在 ACTION_DOWN 的 3 秒内未触发。意思是,如果用户点击后已经过了 3 秒,但还没有释放,我想知道,本质上是试图确定长点击。

有没有办法做这样的事情?

   switch (event.getAction()) {
       case MotionEvent.ACTION_DOWN:
       break;
       case MotionEvent.ACTION_UP:
       break;
    }
4

3 回答 3

3

通常,检测长按的正确方法是实现 View.OnLongClickListener。这比自己检测更容易,更不容易出错,并且可以确保您的应用程序与系统的其余部分完美匹配。

对于 custom View,您将添加implements View.OnLongClickListener到您的类声明中,添加setOnLongClickListener(this);到构造函数中,然后将onLongClick()方法添加到您的类中:

public boolean onLongClick (View v) {
    // Handle long-click
}

如果您View不是自定义的,您可以像这样添加侦听器:

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.postDelayed(). 在 ACTION_DOWN 上,我会发布(例如 3000 毫秒延迟)Runnable处理长按的 a Handler,然后我会在 ACTION_UP 上取消它。因此,任何小于延迟的按下都不会最终调用Runnable,但如果在延迟之后没有发生 ACTION_UP ,那就是。

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

于 2012-06-13T06:04:05.657 回答
0

它简单直接。您需要获取时间戳来评估事件之间的时间差异您可以通过以下示例进行操作:

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 所说,您应该更好地利用View.OnLongClickListener这是一种无忧的方法。

于 2012-06-13T06:02:28.910 回答
0

当用户单击时,启动一个新线程来轮询按钮的当前状态(或引入一个新标志,该标志在 中设置DOWN和重置UP。线程可以每 100 毫秒轮询此状态或标志,并使用内部时间戳来确定是否3 秒过去了。如果是这样,它可能会触发一个新事件以开始长按操作

于 2012-06-13T06:20:28.427 回答