有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在交换机/机箱中添加等待?

当用户单击时,case MotionEvent。触发了“下一步”操作。释放单击时,case MotionEvent。触发了动作_UP

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

有没有办法做这样的事

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

共 (3) 个答案

  1. # 1 楼答案

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

    对于自定义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上,我会发布一个Runnable(延迟3000ms)来处理对aHandler的长按,我会在ACTION_UP上取消它。因此,任何小于延迟的按下操作都不会调用Runnable,但如果延迟后没有发生动作,则会调用

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

  2. # 2 楼答案

    它简单明了。您需要获得时间戳来评估事件之间的时间差,您可以通过以下示例进行评估:

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

  3. # 3 楼答案

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