71 lines
1.9 KiB
JavaScript
71 lines
1.9 KiB
JavaScript
/**
|
|
* Press
|
|
* Recognized when the pointer is down for x ms without any movement.
|
|
* @constructor
|
|
* @extends Recognizer
|
|
*/
|
|
function PressRecognizer() {
|
|
Recognizer.apply(this, arguments);
|
|
|
|
this._timer = null;
|
|
this._input = null;
|
|
}
|
|
|
|
inherit(PressRecognizer, Recognizer, {
|
|
/**
|
|
* @namespace
|
|
* @memberof PressRecognizer
|
|
*/
|
|
defaults: {
|
|
event: 'press',
|
|
pointers: 1,
|
|
time: 251, // minimal time of the pointer to be pressed
|
|
threshold: 9 // a minimal movement is ok, but keep it low
|
|
},
|
|
|
|
getTouchAction: function() {
|
|
return [TOUCH_ACTION_AUTO];
|
|
},
|
|
|
|
process: function(input) {
|
|
var options = this.options;
|
|
var validPointers = input.pointers.length === options.pointers;
|
|
var validMovement = input.distance < options.threshold;
|
|
var validTime = input.deltaTime > options.time;
|
|
|
|
this._input = input;
|
|
|
|
// we only allow little movement
|
|
// and we've reached an end event, so a tap is possible
|
|
if (!validMovement || !validPointers || (input.eventType & (INPUT_END | INPUT_CANCEL) && !validTime)) {
|
|
this.reset();
|
|
} else if (input.eventType & INPUT_START) {
|
|
this.reset();
|
|
this._timer = setTimeoutContext(function() {
|
|
this.state = STATE_RECOGNIZED;
|
|
this.tryEmit();
|
|
}, options.time, this);
|
|
} else if (input.eventType & INPUT_END) {
|
|
return STATE_RECOGNIZED;
|
|
}
|
|
return STATE_FAILED;
|
|
},
|
|
|
|
reset: function() {
|
|
clearTimeout(this._timer);
|
|
},
|
|
|
|
emit: function(input) {
|
|
if (this.state !== STATE_RECOGNIZED) {
|
|
return;
|
|
}
|
|
|
|
if (input && (input.eventType & INPUT_END)) {
|
|
this.manager.emit(this.options.event + 'up', input);
|
|
} else {
|
|
this._input.timeStamp = now();
|
|
this.manager.emit(this.options.event, this._input);
|
|
}
|
|
}
|
|
});
|