Я изменил этот код, чтобы обнаруживать события удержания (длинные щелчки), а также короткие и двойные щелчки. Он работает, задерживая обнаружение короткого щелчка до события ACTION_UP, где событие еще не было обработано (clickHandled == false).
Предоставьте свои собственные методы для onShortClick (), onLongClick () и onDoubleClick ().
private long thisTouchTime;
private long previousTouchTime = 0;
private long buttonHeldTime;
private boolean clickHandled = false;
private long DOUBLE_CLICK_INTERVAL = ViewConfiguration.getDoubleTapTimeout();
private long LONG_HOLD_TIMEOUT = ViewConfiguration.getLongPressTimeout();
@Override
public boolean onTouch(View v, final MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
thisTouchTime = System.currentTimeMillis();
if (thisTouchTime - previousTouchTime <= DOUBLE_CLICK_INTERVAL) {
// double click detected
clickHandled = true;
onDoubleClick(event);
} else {
// defer event handling until later
clickHandled = false;
}
previousTouchTime = thisTouchTime;
break;
case MotionEvent.ACTION_UP:
if (!clickHandled) {
buttonHeldTime = System.currentTimeMillis() - thisTouchTime;
if (buttonHeldTime > LONG_HOLD_TIMEOUT) {
clickHandled = true;
onLongClick(event);
} else {
Handler myHandler = new Handler() {
public void handleMessage(Message m) {
if (!clickHandled) {
clickHandled = true;
onShortClick(event);
}
}
};
Message m = new Message();
myHandler.sendMessageDelayed(m, DOUBLE_CLICK_INTERVAL);
}
}
break;
case MotionEvent.ACTION_MOVE:
myParams.x = initialDrawX + (int) (event.getRawX() - initialTouchX);
myParams.y = initialDrawY + (int) (event.getRawY() - initialTouchY);
windowManager.updateViewLayout(v, myParams);
break;
}
return false;
}