ScrollInner.ts 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. import ScrollOut from "./ScrollOut";
  2. const { ccclass, property, menu } = cc._decorator;
  3. @ccclass
  4. @menu('Scroll/ScrollInner')
  5. export default class ScrollInner extends cc.ScrollView {
  6. scrollOutView: ScrollOut
  7. canScroll: boolean = true
  8. setOuterScrollView(outer) {
  9. this.scrollOutView = outer;
  10. }
  11. //#region 重写cc.ScrollView的方法
  12. _onTouchMoved(event, captureListeners) {
  13. if (!this.enabledInHierarchy) return;
  14. if (this._hasNestedViewGroup(event, captureListeners)) return;
  15. var touch = event.touch;
  16. var deltaMove = touch.getLocation().sub(touch.getStartLocation());
  17. if (this.content) {
  18. if (this.canScroll) {
  19. this["_handleMoveLogic"](touch);
  20. }
  21. }
  22. if (!this.cancelInnerEvents) {
  23. return;
  24. }
  25. if (deltaMove.mag() > 7) {
  26. if (!this["_touchMoved"] && event.target !== this.node) {
  27. var cancelEvent = new cc.Event.EventTouch(event.getTouches(), event.bubbles);
  28. cancelEvent.type = cc.Node.EventType.TOUCH_CANCEL;
  29. cancelEvent.touch = event.touch;
  30. cancelEvent["simulate"] = true;
  31. event.target.dispatchEvent(cancelEvent);
  32. this["_touchMoved"] = true;
  33. }
  34. }
  35. this["_stopPropagationIfTargetIsMe"](event);
  36. }
  37. //#region 重写cc.ScrollView的方法
  38. _hasNestedViewGroup(event, captureListeners) {
  39. if (event.eventPhase !== cc.Event.CAPTURING_PHASE) return;
  40. //不阻止out上onTouch事件执行。
  41. return false;
  42. }
  43. //#endregion
  44. }