【问题标题】:How do I delay a button performing an action by a certain timeframe, if the button wasn't pressed again in that timeframe?如果在该时间范围内未再次按下按钮,如何将按钮执行操作延迟某个时间范围?
【发布时间】:2016-03-17 00:26:44
【问题描述】:

对不起,糟糕的标题,我不擅长描述这些事情。

我正在构建一个节拍器,并且有一个 (-) UI 按钮可以将速度减 1,还有一个 (+) UI 按钮可以将速度增加 1。

我目前的问题是,每当我按下任一按钮时,节拍器都会重新启动,因为有一个新的速度,并立即播放。因此,如果您连续按下 (-) 按钮 10 次,则每次按下时都会听到初始节拍器的“哔”声。

我希望我的应用执行以下操作:

  • 当用户单击 (-) 或 (+) 按钮时,等待 200 毫秒
  • 如果用户在该时间段内没有再次点击按钮,则播放节拍器
  • 如果用户再次单击按钮,则不播放节拍器,重复该过程:等待 200 毫秒,如果没有单击则播放节拍器等

最终结果是,如果我的速度为 100 bpm,并且我重复按 (+) 按钮 20 次直到达到 120 bpm,则在我敲完之前节拍器不会开始播放。

我该如何实施呢?谢谢!

【问题讨论】:

  • 听起来你刚刚描述了你应该编写的算法来实现你想要它做的事情。哪一部分你不知道怎么做?
  • 我是 android 和 Java 开发的新手,所以有点不知所措。我不确定实现它的最佳/正确方法是什么。

标签: java android


【解决方案1】:

在您的活动中声明并实例化以下内容:

     private Handler timeoutHandler = new Handler();
     private Runnable delayStartThread = new Runnable() {
                public void run() {
                    startMetronome();
                }
            };

然后在onClickListener 中为+- 按钮插入以下代码块:

    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            timeoutHandler.removeCallbacks(delayStartThread);
            tempoOfMetronome++; //tempoOfMetronome--; for decrease button
            stopMetronome();
            timeoutHandler.postDelayed(delayStartThread, 200);
        }
    });

有关代码如何工作的更多详细信息,请参阅以下示例链接(我使用这些示例来制定答案):

  1. Android: clicking TWICE the back button to exit activity - 如何使用handler.postDelayed()
  2. How to cancel handler.postDelayed? - 如何取消 handler.postDelayed()

您还应该查看这些方法的 Android 文档。

【讨论】:

    【解决方案2】:

    如果您希望动作和效果之间有延迟,有几种方法可以实现。这是一个。

     private boolean pressedAction = false;
    
    @override
    public void onClick(View v) {
    
        if (pressedAction) return;
        pressedAction = true;
        new Thread(new Runnable(
            @override
            public void run() {
    
                try {
                    Thread.sleep(200); // 200 miliseconds
                } catch (Exception e) {}
    
                // Update views or do work (program logic)
    
                pressedAction = false;
            }
        }
    
    }
    

    那么,节拍器逻辑就是你的事了。

    【讨论】:

    • 感谢您的回答。除非我误解了你,否则我认为这不是我要找的。这似乎是一个简单的延迟,但我正在寻找的是更复杂一点:如果用户连续按下按钮 20 次,我只希望最后一次点击来执行该功能 - 前 19 次点击应该做没有什么。在这种情况下,如果我连续按下按钮 20 次,该函数仍会执行 20 次,但有延迟。我希望这会让它更清楚。谢谢
    猜你喜欢
    • 1970-01-01
    • 2012-10-19
    • 1970-01-01
    • 2012-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多