scrollView和OnTouchCancel联合使用出错

首先我们来看一下CCScrollView.js源码:

_onTouchMoved(event, captureListeners) {
        if (!this.enabledInHierarchy) return;
        if (this._hasNestedViewGroup(event, captureListeners)) return;

        let touch = event.touch;
        if (this.content) {
            this._handleMoveLogic(touch);
        }
        // Do not prevent touch events in inner nodes
        if (!this.cancelInnerEvents) {
            return;
        }

        let deltaMove = touch.getLocation().sub(touch.getStartLocation());
        //FIXME: touch move delta should be calculated by DPI.
        if (deltaMove.mag() > 7) {
            if (!this._touchMoved && event.target !== this.node) {
                // Simulate touch cancel for target node
                let cancelEvent = new cc.Event.EventTouch(event.getTouches(), event.bubbles);
                cancelEvent.type = cc.Node.EventType.TOUCH_CANCEL;
                cancelEvent.touch = event.touch;
                cancelEvent.simulate = true;
                event.target.dispatchEvent(cancelEvent);
                this._touchMoved = true;
            }
        }
        this._stopPropagationIfTargetIsMe(event);
    },

cancelInnerEvents被设置为 true时,滚动行为会取消子节点上注册的触摸事件。
但是子节点item上的 touch事件仍然会触发。
cancelInnerEvents为true时,scrollView在它自身的touchMove过程中,如果touch对象的移动了足够的距离,它会让当前的touch对象发送一次touchcancel信号。(你可以给item加一个button组件然后加上cancel效果就明白了)
然后当你鼠标放开的时候,你自己注册的touchcancel事件又发送了一次。
所以当cancelInnerEvents为true,就会发送了两次touchcancel。

谢谢啦:14:

取消选中Elastic不得行,我就取消最下面的一个属性就OK了,为啥子

我之前说的有点不对,你看下我修改的。