package org.andengine.input.touch.detector;
import org.andengine.input.touch.TouchEvent;
/**
* (c) 2010 Nicolas Gramlich
* (c) 2011 Zynga Inc.
*
* @author Nicolas Gramlich
* @author Greg Haynes
* @since 14:29:59 - 16.08.2010
*/
public class ClickDetector extends BaseDetector {
// ===========================================================
// Constants
// ===========================================================
private static final long TRIGGER_CLICK_MAXIMUM_MILLISECONDS_DEFAULT = 200;
// ===========================================================
// Fields
// ===========================================================
private long mTriggerClickMaximumMilliseconds;
private final IClickDetectorListener mClickDetectorListener;
private int mPointerID = TouchEvent.INVALID_POINTER_ID;
private long mDownTimeMilliseconds = Long.MIN_VALUE;
// ===========================================================
// Constructors
// ===========================================================
public ClickDetector(final IClickDetectorListener pClickDetectorListener) {
this(ClickDetector.TRIGGER_CLICK_MAXIMUM_MILLISECONDS_DEFAULT, pClickDetectorListener);
}
public ClickDetector(final long pTriggerClickMaximumMilliseconds, final IClickDetectorListener pClickDetectorListener) {
this.mTriggerClickMaximumMilliseconds = pTriggerClickMaximumMilliseconds;
this.mClickDetectorListener = pClickDetectorListener;
}
// ===========================================================
// Getter & Setter
// ===========================================================
public long getTriggerClickMaximumMilliseconds() {
return this.mTriggerClickMaximumMilliseconds;
}
public void setTriggerClickMaximumMilliseconds(final long pClickMaximumMilliseconds) {
this.mTriggerClickMaximumMilliseconds = pClickMaximumMilliseconds;
}
// ===========================================================
// Methods for/from SuperClass/Interfaces
// ===========================================================
@Override
public void reset() {
this.mDownTimeMilliseconds = Long.MIN_VALUE;
this.mPointerID = TouchEvent.INVALID_POINTER_ID;
}
@Override
public boolean onManagedTouchEvent(final TouchEvent pSceneTouchEvent) {
switch(pSceneTouchEvent.getAction()) {
case TouchEvent.ACTION_DOWN:
this.prepareClick(pSceneTouchEvent);
return true;
case TouchEvent.ACTION_UP:
case TouchEvent.ACTION_CANCEL:
if(this.mPointerID == pSceneTouchEvent.getPointerID()) {
boolean handled = false;
final long upTimeMilliseconds = pSceneTouchEvent.getMotionEvent().getEventTime();
if(upTimeMilliseconds - this.mDownTimeMilliseconds <= this.mTriggerClickMaximumMilliseconds) {
this.mDownTimeMilliseconds = Long.MIN_VALUE;
this.mClickDetectorListener.onClick(this, pSceneTouchEvent.getPointerID(), pSceneTouchEvent.getX(), pSceneTouchEvent.getY());
handled = true;
}
this.mPointerID = TouchEvent.INVALID_POINTER_ID;
return handled;
} else {
return false;
}
default:
return false;
}
}
// ===========================================================
// Methods
// ===========================================================
private void prepareClick(final TouchEvent pSceneTouchEvent) {
this.mDownTimeMilliseconds = pSceneTouchEvent.getMotionEvent().getDownTime();
this.mPointerID = pSceneTouchEvent.getPointerID();
}
// ===========================================================
// Inner and Anonymous Classes
// ===========================================================
public static interface IClickDetectorListener {
// ===========================================================
// Constants
// ===========================================================
// ===========================================================
// Methods
// ===========================================================
public void onClick(final ClickDetector pClickDetector, final int pPointerID, final float pSceneX, final float pSceneY);
}
}