PixiJS - 并非触发所有touchend事件(在displayObject之外)

时间:2016-06-17 13:08:47

标签: pixi.js pixijs

Pixijs(3.0.8)支持多点触控,如演示中所示,我已设置startmoveend听众,以便在我的手机上进行触控设备

触摸被注册在画布中的一个正方形上,我称之为interactiveArea,但是当我们离开该区域时触发了touchend事件。这种行为适用于单个鼠标光标。

然而,当使用更多手指时,使用标识符012进行触摸时,只会在区域外触发第一个touchEnd。 所以我在interactiveArea内按住3个手指并将它们全部移到它外面。然后我放开1,然后放开其他人。我没有收到有关事件0和2的touchEnds的通知,而且我必须重新注册3次触摸并正确放手以获得触发2的触摸!

关于我如何能够检测到所有头衔的任何提示,而不是让它在第一次触发时停止?我也试过使用setTimeout hack,但这确实不适合我的用例。

编辑我已经制作了一个基本的codepen来演示touchendoutside仅触发一次的方式。 https://codepen.io/Thomaswithaar/pen/EygRjM请在移动设备上访问笔,因为它是关于触摸而不是鼠标交互。 将两根手指放在红色方块上,然后将它们移出并放开只会触发一个 touchendoutside事件。

1 个答案:

答案 0 :(得分:1)

查看PIXI源代码,交互管理器确实存在一个错误。以下是处理触摸结束事件的方法:

InteractionManager.prototype.processTouchEnd = function ( displayObject, hit )
{
    if(hit)
    {
        this.dispatchEvent( displayObject, 'touchend', this.eventData );

        if( displayObject._touchDown )
        {
            displayObject._touchDown = false;
            this.dispatchEvent( displayObject, 'tap', this.eventData );
        }
    }
    else
    {
        if( displayObject._touchDown )
        {
            displayObject._touchDown = false;
            this.dispatchEvent( displayObject, 'touchendoutside', this.eventData );
        }
    }
};

您可以在else语句中看到touchendoutside为真时调度displayObject._touchDown事件。但是在释放第一根手指后,它会将标志设置为false。这就是为什么你只收到一次这个事件。

我在这里开了一个问题: https://github.com/pixijs/pixi.js/issues/2662

并提供了一个解决方案: https://github.com/karmacon/pixi.js/blob/master/src/interaction/InteractionManager.js 此解决方案删除标志并使用计数器。我还没有测试过,所以请告诉我它是否有效。