首先我们来看一下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。
谢谢啦

取消选中Elastic不得行,我就取消最下面的一个属性就OK了,为啥子
我之前说的有点不对,你看下我修改的。
