我正在尝试修改Hammer.js,所以当pan被触发时,我想将距离等于0,这样用户需要移动到足以再次触发pan而不取消pan。
现在当平移距离大于平移阈值时,如果向任意方向移动1px,则会触发平移方向。
此外,我不希望在触发时强制取消平移,因为用户需要再次单击以启动平移事件。
触发摇摄方向时,这是火警代码。
emit: function(input) {
this.pX = input.deltaX;
this.pY = input.deltaY;
var direction = directionStr(input.direction);
if (direction) {
this.manager.emit(this.options.event + direction, input);
}
this._super.emit.call(this, input);
}
我试图将input.distance修改为0,但它只影响该函数中的变量,而不是实际值。
然后我尝试添加这个:
mc.add( new Hammer.Pan({ direction: Hammer.DIRECTION_ALL, threshold: 10 }) );
但这取消了当前的泛事件。
还尝试取消当前平移并将其激活到等于0的距离,但它也取消当前平移......
mc.get('pan').set({ enable: false });
mc.get('pan').set({ enable: true });
答案 0 :(得分:1)
我用一些奇怪的代码解决了我的问题,如果你只使用平移功能或所有阈值都相等就使用它。
将此行添加到文件的开头:
...
var abs = Math.abs;
var now = Date.now;
//Add emitPanDirection
var emitPanDirection;
...
然后将其添加到computeInputData函数
function computeInputData(manager, input) {
....
input.angle = getAngle(offsetCenter, center);
input.distance = getDistance(offsetCenter, center);
//This will reset firstInput.center and firstMultiple.center to current mouse location
if(input.distance > manager.options.preset[3][1].threshold){
emitPanDirection=true;
session.firstInput.center=getCenter(pointers);
session.firstMultiple.center=getCenter(pointers);
}
....
}
在inherit中更改此代码(PanRecognizer,AttrRecognizer,{...
attrTest: function(input) {
return AttrRecognizer.prototype.attrTest.call(this, input) &&
(this.state & STATE_BEGAN || (!(this.state & STATE_BEGAN) && this.directionTest(input)));
},
对于这个:
attrTest: function(input) {
return (AttrRecognizer.prototype.attrTest.call(this, input) && this.directionTest(input));
},
最后在相同的PanRecognizer
中的emit:function(input)中添加emit: function(input) {
//Need to add this if or emit will emit pandirection twice
if(emitPanDirection){
emitPanDirection=false;
this.pX = input.deltaX;
this.pY = input.deltaY;
var direction = directionStr(input.direction);
if (direction) {
this.manager.emit(this.options.event + direction, input);
}
this._super.emit.call(this, input);
}
}