From 344ca57f4b6e98b9609e9e869fe0ba4a5d999bec Mon Sep 17 00:00:00 2001 From: Simon Jackson Date: Wed, 4 Jan 2017 13:18:28 +0000 Subject: [PATCH] Updated VSS / HSS to handle pages with interactable components. Interactables mess with the Pointer Down/Up events that the control used when a mouse is used, so implementation changes to suit. --HG-- branch : develop_5.3 --- Scripts/Layout/HorizontalScrollSnap.cs | 17 +++++++++++------ Scripts/Layout/ScrollSnapBase.cs | 12 ++---------- Scripts/Layout/VerticalScrollSnap.cs | 21 +++++++++++++++------ 3 files changed, 28 insertions(+), 22 deletions(-) diff --git a/Scripts/Layout/HorizontalScrollSnap.cs b/Scripts/Layout/HorizontalScrollSnap.cs index 58b3578..b8361c3 100644 --- a/Scripts/Layout/HorizontalScrollSnap.cs +++ b/Scripts/Layout/HorizontalScrollSnap.cs @@ -43,19 +43,22 @@ namespace UnityEngine.UI.Extensions } CurrentPage = GetPageforPosition(_screensContainer.localPosition); - + //If the container is moving check if it needs to settle on a page - if (!_pointerDown && (_scroll_rect.velocity.x > 0.01 || _scroll_rect.velocity.x < 0.01)) + if (!_pointerDown) { - // if the pointer is released and is moving slower than the threshold, then just land on a page - if (IsRectMovingFasterThanThreshold(0)) + if (_scroll_rect.velocity.x > 0.01 || _scroll_rect.velocity.x < 0.01) { - ScrollToClosestElement(); + //if the pointer is released and is moving slower than the threshold, then just land on a page + if (IsRectMovingSlowerThanThreshold(0)) + { + ScrollToClosestElement(); + } } } } - private bool IsRectMovingFasterThanThreshold(float startingSpeed) + private bool IsRectMovingSlowerThanThreshold(float startingSpeed) { return (_scroll_rect.velocity.x > startingSpeed && _scroll_rect.velocity.x < SwipeVelocityThreshold) || (_scroll_rect.velocity.x < startingSpeed && _scroll_rect.velocity.x > -SwipeVelocityThreshold); @@ -195,6 +198,8 @@ namespace UnityEngine.UI.Extensions /// public void OnEndDrag(PointerEventData eventData) { + _pointerDown = false; + if (_scroll_rect.horizontal) { if (UseFastSwipe) diff --git a/Scripts/Layout/ScrollSnapBase.cs b/Scripts/Layout/ScrollSnapBase.cs index 67fabf2..34c81ce 100644 --- a/Scripts/Layout/ScrollSnapBase.cs +++ b/Scripts/Layout/ScrollSnapBase.cs @@ -4,7 +4,7 @@ using UnityEngine.EventSystems; namespace UnityEngine.UI.Extensions { - public class ScrollSnapBase : MonoBehaviour, IBeginDragHandler, IDragHandler, IPointerDownHandler, IPointerUpHandler + public class ScrollSnapBase : MonoBehaviour, IBeginDragHandler, IDragHandler { internal RectTransform _screensContainer; internal bool _isVertical; @@ -404,6 +404,7 @@ namespace UnityEngine.UI.Extensions /// public void OnBeginDrag(PointerEventData eventData) { + _pointerDown = true; _settled = false; StartScreenChange(); _startPosition = _screensContainer.localPosition; @@ -418,15 +419,6 @@ namespace UnityEngine.UI.Extensions _lerp = false; } - public void OnPointerDown(PointerEventData eventData) - { - _pointerDown = true; - } - - public void OnPointerUp(PointerEventData eventData) - { - _pointerDown = false; - } #endregion } } \ No newline at end of file diff --git a/Scripts/Layout/VerticalScrollSnap.cs b/Scripts/Layout/VerticalScrollSnap.cs index 0d92abb..b563b46 100644 --- a/Scripts/Layout/VerticalScrollSnap.cs +++ b/Scripts/Layout/VerticalScrollSnap.cs @@ -45,16 +45,23 @@ namespace UnityEngine.UI.Extensions CurrentPage = GetPageforPosition(_screensContainer.localPosition); //If the container is moving check if it needs to settle on a page - if (!_pointerDown && (_scroll_rect.velocity.y > 0.01 || _scroll_rect.velocity.y < -0.01)) + if (!_pointerDown) { - // if the pointer is released and is moving slower than the threshold, then just land on a page - if ((_scroll_rect.velocity.y > 0 && _scroll_rect.velocity.y < SwipeVelocityThreshold) || - (_scroll_rect.velocity.y < 0 && _scroll_rect.velocity.y > -SwipeVelocityThreshold)) - { - ScrollToClosestElement(); + if (_scroll_rect.velocity.y > 0.01 || _scroll_rect.velocity.y < -0.01) + { + // if the pointer is released and is moving slower than the threshold, then just land on a page + if (IsRectMovingSlowerThanThreshold(0)) + { + ScrollToClosestElement(); + } } } + } + private bool IsRectMovingSlowerThanThreshold(float startingSpeed) + { + return (_scroll_rect.velocity.y > startingSpeed && _scroll_rect.velocity.y < SwipeVelocityThreshold) || + (_scroll_rect.velocity.y < startingSpeed && _scroll_rect.velocity.y > -SwipeVelocityThreshold); } public void DistributePages() @@ -191,6 +198,8 @@ namespace UnityEngine.UI.Extensions /// public void OnEndDrag(PointerEventData eventData) { + _pointerDown = false; + if (_scroll_rect.vertical) { if (UseFastSwipe)