[我希望当您在3秒钟内按住按钮时可以执行某些操作,我尝试使用上面的代码,但是仅当我在按住期间停止不按住时,它才会执行某些操作。我应该实现一个监听器或类似的东西吗?
finishPushing = true;
.
.
.
button.setOnTouchListener(new OnTouchListener()
{
@Override
public boolean onTouch(View v, MotionEvent event) {
if(android.os.SystemClock.elapsedRealtime() - event.getDownTime() > 3000 && (event.getPointerCount() == 1) && finishPushing)
{
// Do something
finishPushing = false;
}
else{
finishPushing = true;
}
return false;
}
});
感谢Android Touch Event determining duration解决了
button.setOnTouchListener(new OnTouchListener()
{
private final Handler handler = new Handler();
private final Runnable runnable = new Runnable() {
public void run() {
if(mBooleanIsPressed)
{
// do whatever
}
}
};
@Override
public boolean onTouch(View v, MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_DOWN) {
// Execute your Runnable after 5000 milliseconds = 5 seconds.
//After this 5secs it will check if is pressed
handler.postDelayed(runnable, 5000);
mBooleanIsPressed = true;
}
if(event.getAction() == MotionEvent.ACTION_UP) {
if(mBooleanIsPressed) {
mBooleanIsPressed = false;
handler.removeCallbacks(runnable);
}
}
return false;
}
});
此解决方案灵活且可重复使用,对我有很大帮助。
public class OnLongPressListener implements View.OnTouchListener {
private static Handler handler = new Handler();
private static final long WAIT_TIME_DELTA = 1000;
private static boolean isCanceled = false;
private static LongPressListener listener;
private static long startTime;
public OnLongPressListener(LongPressListener listener) {
OnLongPressListener.listener = listener;
}
@Override
public boolean onTouch(View v, MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_DOWN) {
startTime = System.currentTimeMillis();
startTimer();
}
if(event.getAction() == MotionEvent.ACTION_UP) {
//Make sure single press isn't called if it was long
if(startTime > System.currentTimeMillis() - WAIT_TIME_DELTA) {
isCanceled = true;
listener.doOnSinglePress();
}
}
return true;
}
private static void startTimer() {
handler.postDelayed(runnable, WAIT_TIME_DELTA);
}
private static Runnable runnable = new Runnable() {
@Override
public void run() {
if(!isCanceled) {
listener.doOnLongPress();
}
isCanceled = false;
}
};
public interface LongPressListener {
void doOnLongPress();
void doOnSinglePress();
}
}
您当然不必像我一样使用该界面,但这是为具有OnTouch方法的任何视图设置长按侦听器的最简单方法。