我有一个按钮,我按下它并继续按住它,如果保持时间超过一定的时间间隔它会激发某种意图,我该怎么做呢。 谢谢
答案 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;
}
});
其中b
是view
(在您的情况下应该是按钮),您想要长按一次。
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_DOWN
和ACTION_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.
}
});