【问题标题】:How can I get button pressed time when I holding button on按住按钮时如何获得按钮按下时间
【发布时间】:2014-03-24 10:39:23
【问题描述】:

我有一个按钮,我按下它并继续按住它,如果按住时间超过一定的时间间隔它会触发某种意图,我该怎么做。 谢谢

【问题讨论】:

  • 在发布之前你做了什么
  • 你应该试试 Longclick 监听器。
  • 我试过了(LongClickListener),但是持续时间不够长。
  • 任何东西都像显示吐司,如果保持时间长达 5 秒。
  • 你可以试试我的回答

标签: android button time


【解决方案1】:

试试这个

您可以使用Touch Listener 来执行此操作。

试试:

Handler handler = new Handler();
    b.setOnTouchListener(new View.OnTouchListener() {

        @Override
        public boolean onTouch(View arg0, MotionEvent arg1) {
            switch (arg1.getAction()) {
            case MotionEvent.ACTION_DOWN:
                handler.postDelayed(run, 5000/* OR the amount of time you want */);
                break;

            default:
                handler.removeCallbacks(run);
                break;

            }
            return true;
        }
    });

b 是您想要长按的view(在您的情况下应该是按钮)。

Runnablerun如下

Runnable run = new Runnable() {

    @Override
    public void run() {
        // Your code to run on long click

    }
};

希望它会有所帮助... :)

【讨论】:

  • 如何每5000(需要多少时间)调用一次事件?
【解决方案2】:

检测[ACTION_DOWN][1][ACTION_UP][2] 事件。

按下按钮时 ([ACTION_DOWN][1]),启动计时器,测量时间...如果计时器超过,调用 Intent。释放按钮时 ([ACTION_UP][2]) 停止计时器。

final Timer timer = new Timer();
button.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View arg0, MotionEvent arg1) {
        switch ( arg1.getAction() ) {
        case MotionEvent.ACTION_DOWN:
            //start timer
            timer.schedule(new TimerTask() {
                @Override
                public void run() {
                    // invoke intent
                }
            }, 5000); //time out 5s
            return true;
        case MotionEvent.ACTION_UP:
            //stop timer
            timer.cancel();
            return true;
        }
        return false;
    }
});

当按下按钮时,计时器将启动。如果按钮将在 5 秒超时之前释放,则不会发生任何事情,否则将执行您想要的操作。

【讨论】:

  • 这不是 OP 所要求的。如果在按钮仍然按住的情况下经过了一定的时间间隔,他需要启动动作。
  • 哪里有问题?如果计时器将超时,这意味着按钮仍处于关闭状态,因为计时器未在 ACTION_UP 中停止。
  • 你是对的。您能否在您的 cmets 中也澄清这一点?这就是我最终误会的原因。
  • 我也更新了例子,所以我希望我的想法更清楚。
【解决方案3】:
long lastDown;
long keyPressedDuration ;

button.setOnTouchListener(new OnTouchListener() {
     @Override
     public boolean onTouch(View v, MotionEvent event) {
        if(event.getAction() == MotionEvent.ACTION_DOWN) {
           lastDown = System.currentTimeMillis();
        } else if (event.getAction() == MotionEvent.ACTION_UP) {
           keyPressedDuration = System.currentTimeMillis() - lastDown;
        }
     }
  };

【讨论】:

  • 我不认为这符合 OP 的要求,即如果 ACTION_DOWN(由于按住不放)已经持续了长按持续时间以外的持续时间,则开始执行操作。
【解决方案4】:

您可以覆盖 onTouchEvent 并计算ACTION_DOWNACTION_UP 之间的偏移量;

下面的代码将在 x 时间后运行一个可运行文件,如果在 x 时间之前调用 ACTION_UP,也会将其删除。还包括如何获得准确的时间值...

@Override
public boolean onTouchEvent(MotionEvent ev) {
    if (ev.getAction() == MotionEvent.ACTION_DOWN) {
        // record the start time
        mStartTime = ev.getEventTime();
        mHandler.postDelayed(mTaskToRun, MAXIMUM_LONG_PRESS_INTERVAL);
    } else if (ev.getAction() == MotionEvent.ACTION_UP) {
        // record the end time
        mEndTime = ev.getEventTime();

        long keyPressedDuration = mEndTime - mStartTime;

        mHandler.removeCallbacks(mTaskToRun);
    }

    return super.onTouchEvent(ev);
}

【讨论】:

  • 您是否在计算 keyPressedDuration 以检查 ACTION_UP 发生时是否超过了某个时间间隔?它现在没有在你的代码中做任何事情......另外,MAXIMUM_LONG_PRESS_INTERVAL 是我们定义的,不是吗?
  • 以一定的时间间隔调用延迟的 postDelayed() 没有任何作用?那里的计算仅供参考。处理程序正在完成所有工作。
  • 我是说 keyPressedDuration 没有做任何事情;它已定义并计算了一个值,但未在其他地方使用。我确实了解处理程序完成了这项工作。至于计算只是参考,那很好。间隔可以由用户定义。这就是我希望你的意思。
  • 啊!我错过了另一件事。您说,“如果在 x 时间之前调用 ACTION_UP,也将其删除”,但无论时间已过,代码都会删除 ACTION_UP 上的事件。这种行为是OP想要的,afaik。但是,您描述的行为需要对 keyPressedDuration 进行额外检查,对吧?
  • 否,“如果持有时间超过一定的时间间隔,它会触发某种意图”间隔”。否则我们不管,删除延迟的任务,因为它没有达到最小间隔。
【解决方案5】:

我在使用计时器时遇到了异常! 您还可以使用如下所示的处理程序 -

final Handler handler = new Handler();
final Runnable run = new Runnable(){
        @Override
        public void run() {
            //Do your Stuff!     
        }
    };
    button.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(final View view, MotionEvent motion) {
                switch (motion.getAction() ) {
                    case MotionEvent.ACTION_DOWN:
                        handler.postDelayed(run, 5000); //5 seconds delay
                        return true;

                    case MotionEvent.ACTION_UP:
                        handler.removeCallbacks(run);
                        return true;
                        }
                        return false;
                    }});

【讨论】:

    【解决方案6】:

    编辑。

    显然,我误解了这个问题。请参阅上面的@Hardik 和@Lunar 解决方案。


    你可以做这样的事情:

    button.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            long duration = 0L;
    
            final int action = event.getAction();
            switch (action) {
                case MotionEvent.ACTION_DOWN:
                    duration = SystemClock.elapsedRealtime();
                    break;
                case MotionEvent.ACTION_UP:
                    duration = SystemClock.elapsedRealtime() - duration;
                    break;
                default:
                    break;
            }
    
            if (duration > YOUR_INTERVAL_IN_MILLIS) {
                // Do stuff...
            }
    
            return true; // or whatever you want to return.
        }
    });
    

    【讨论】:

    • 感谢您复制过去,但您的代码将无法正常工作。
    • 我的回答更像是一个解决方案展示,因此,未经测试,绝对不是设计为复制粘贴解决方案。你的反对票是个笑话。
    • 如果逻辑代码在switch case MotionEvent.ACTION_UP里面请写
    • curtisLoew,您的代码没有回答这个问题,因为它只在发生 ACTION_UP 并且经过一定时间后才执行某些操作。 @Hardik 和 Lunar 发布了解决方案。你可能想看看那些并提出一种替代方法或其他东西。
    • @batbrat 你是对的,我误解了这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-07
    • 1970-01-01
    • 2021-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多