当我按住按钮时,如何按下按钮的时间

时间:2014-03-24 10:39:24

标签: android button time

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

6 个答案:

答案 0 :(得分:13)

试试这个

您可以使用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;
        }
    });

其中bview(在您的情况下应该是按钮),您想要长按一次。

Runnable run如下

Runnable run = new Runnable() {

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

    }
};

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

答案 1 :(得分:7)

检测[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秒超时之前释放按钮,则不会发生任何事情,否则将执行您想要的操作。

答案 2 :(得分:4)

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;
        }
     }
  };

答案 3 :(得分:0)

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

下面的代码将在x时间后运行runnable,如果在x time之前调用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);
}

答案 4 :(得分:0)

我使用计时器时遇到异常! 您也可以使用下面的处理程序 -

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;
                    }});

答案 5 :(得分:-2)

编辑。

显然,我误解了这个问题。请参阅上面的@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.
    }
});