【问题标题】:Checking if button is held for a duration or if it is just clicked ANDROID检查按钮是否被按住一段时间或是否只是单击 ANDROID
【发布时间】:2019-06-01 18:14:47
【问题描述】:

我正在尝试做一些非常简单的事情,但由于某种原因我无法让它工作。 我有两个圆形按钮。

-当我简单地单击顶部(绿色)按钮时,我希望按钮切换颜色并保持这种状态。

-如果我按住一个按钮 2 秒钟,我希望只要按住按钮,颜色就会交换,但一旦我松开按钮,就会恢复到原来的颜色。

我正在尝试使用 OnClickListener。我使用的开关有 2 种情况:MotionEvent.ACTION_DOWN 和 MotionEvent.ACTION_UP。 (见下面的代码)

为了获得按钮被按住的持续时间,我在 while 循环中使用 System.currentTimeMillis()(当按钮被按住时)-->(如果 timeElapsed > 2000){切换颜色}

完整代码如下:

    greenbutton.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {
            switch (motionEvent.getAction()) {

                case MotionEvent.ACTION_DOWN:
                    startTime = System.currentTimeMillis();
                    while (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
                        currentTime = System.currentTimeMillis();
                        elapsedTime = currentTime - startTime;
                        if (elapsedTime > 500) {
                            if (switched) {
                                revertButtons();
                                return true;
                            } else {
                                switchButtons();
                                return true;
                            }
                        }
                    }


                case MotionEvent.ACTION_UP:

                    if (switched) {
                        revertButtons();
                        elapsedTime = 0;
                        currentTime = 0;
                        startTime = 0;
                        return true;
                    } else {
                        switchButtons();
                        elapsedTime = 0;
                        currentTime = 0;
                        startTime = 0;
                        return true;
                    }

            }
            return false;
        }
    });

【问题讨论】:

  • 您遇到了什么问题?代码不起作用,或者您或您遇到任何异常或错误?
  • 该代码适用于点击,但 UI 中存在暂停。我有一个动画背景,当我点击时,动画会暂停片刻。另外,当我长时间按住按钮时,什么也没有发生。
  • 检查答案
  • 您必须为该按钮设置 onTouchListener 。并在 ACTION_DOWN 和 ACTION_UP 之间停止|启动计时器

标签: java android ontouchlistener


【解决方案1】:

尝试使用预定义的方法 -

  1. onClickListener( () => {} ) 用于单击

  2. onLongClickListener( () => {} ) 用于长按

这样您就不需要计算用户点击的时间,并且通过运行循环或线程,您可以在长时间点击时不断改变颜色。

更新

正如评论中提到的,它只需要一个特定的时间就可以使用以下算法-

  1. 长按按钮启动计时器
  2. 在 2 秒后立即应用您的结果

** 已更新**

由于需要点击时间,请遵循:

  1. 在按钮定义之前创建一个计时器
  2. 使用长点击列表器启动计时器
  3. 在行动停止计时器上,你会得到你的结果

【讨论】:

  • 我想过,但我需要测量按钮在颜色切换之前被按住 2 秒。我不知道如何使用 onLongClickListener 做到这一点。我也不知道如何在松开按钮时恢复颜色,主要是 onLongClickListener()。
  • 但是无论我实际按住按钮整整 2 秒还是仅触发了持续时间较短的 onLongClickListener(),都会应用结果。没有办法检查按钮何时被释放,是吗?
【解决方案2】:

我找到了一个简单的解决方案来研究长按事件的工作原理。 每次单击视图时,CheckForLongPress 类型的 Runnable 都会延迟添加到队列中。如果延迟结束,则调用OnLongClickListener。如果在延迟结束之前有不同的事件,那么,CheckForLongPress Runnable 将从队列中移除。

我只是重写了视图的公共方法postDelayed(Runnable action, long delayMillis)来改变操作系统延迟

@Override public boolean postDelayed(Runnable action, long delayMillis) {
    boolean isLongPress = action.getClass().getSimpleName().equals("CheckForLongPress");
    return super.postDelayed(action, isLongPress ? LONG_PRESS_MILLIS : delayMillis);
}

我将 LONG_PRESS_MILLIS 设置为 100,它正在工作!

希望对你有帮助!!! ;)

信用: MArtinCR

【讨论】:

  • 我喜欢这个主意,但是如何检查按钮何时被释放?如果使用您的代码按住按钮 2 秒钟,我可以切换按钮,但是当我释放按钮时,我希望颜色恢复。如何使用 OnLongClickListener 检查此版本?
猜你喜欢
  • 1970-01-01
  • 2011-12-16
  • 1970-01-01
  • 2021-03-08
  • 2022-01-01
  • 2011-05-11
  • 2013-05-09
  • 2013-07-26
  • 1970-01-01
相关资源
最近更新 更多