当触发摇摄方向时,Hammer.js将距离设置为0

时间:2014-10-30 15:16:12

标签: javascript hammer.js

我正在尝试修改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 });

1 个答案:

答案 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);
    }
}