Skip to content

Commit

Permalink
Scroller behaviour improvements
Browse files Browse the repository at this point in the history
  • Loading branch information
setchi committed Dec 10, 2019
1 parent 88ecf54 commit bf3fd36
Showing 1 changed file with 76 additions and 3 deletions.
79 changes: 76 additions & 3 deletions Assets/FancyScrollView/Sources/Runtime/Scroller/Scroller.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ namespace FancyScrollView
/// <summary>
/// スクロール位置の制御を行うコンポーネント.
/// </summary>
public class Scroller : UIBehaviour, IBeginDragHandler, IEndDragHandler, IDragHandler
public class Scroller : UIBehaviour, IPointerUpHandler, IPointerDownHandler, IBeginDragHandler, IEndDragHandler, IDragHandler, IScrollHandler
{
[SerializeField] RectTransform viewport = default;

Expand Down Expand Up @@ -154,6 +154,8 @@ public float Position

int totalCount;

bool hold;
bool scrolling;
bool dragging;
float velocity;

Expand Down Expand Up @@ -314,6 +316,75 @@ public MovementDirection GetMovementDirection(int sourceIndex, int destIndex)
: MovementDirection.Down;
}

/// <inheritdoc/>
void IPointerDownHandler.OnPointerDown(PointerEventData eventData)
{
if (!draggable || eventData.button != PointerEventData.InputButton.Left)
{
return;
}

hold = true;
velocity = 0f;
autoScrollState.Reset();
}

/// <inheritdoc/>
void IPointerUpHandler.OnPointerUp(PointerEventData eventData)
{
if (!draggable || eventData.button != PointerEventData.InputButton.Left)
{
return;
}

if (hold && snap.Enable)
{
UpdateSelection(Mathf.Clamp(Mathf.RoundToInt(currentPosition), 0, totalCount - 1));
ScrollTo(Mathf.RoundToInt(currentPosition), snap.Duration, snap.Easing);
}

hold = false;
}

/// <inheritdoc/>
void IScrollHandler.OnScroll(PointerEventData eventData)
{
if (!draggable)
{
return;
}

var delta = eventData.scrollDelta;

// Down is positive for scroll events, while in UI system up is positive.
delta.y *= -1;
var scrollDelta = scrollDirection == ScrollDirection.Horizontal
? Mathf.Abs(delta.y) > Mathf.Abs(delta.x)
? delta.y
: delta.x
: Mathf.Abs(delta.x) > Mathf.Abs(delta.y)
? delta.x
: delta.y;

if (eventData.IsScrolling())
{
scrolling = true;
}

var position = currentPosition + scrollDelta / ViewportSize * scrollSensitivity;
if (movementType == MovementType.Clamped)
{
position += CalculateOffset(position - currentPosition);
}

if (autoScrollState.Enable)
{
autoScrollState.Reset();
}

UpdatePosition(position);
}

/// <inheritdoc/>
void IBeginDragHandler.OnBeginDrag(PointerEventData eventData)
{
Expand All @@ -322,6 +393,7 @@ void IBeginDragHandler.OnBeginDrag(PointerEventData eventData)
return;
}

hold = false;
RectTransformUtility.ScreenPointToLocalPointInRectangle(
viewport,
eventData.position,
Expand Down Expand Up @@ -452,7 +524,7 @@ void Update()

UpdatePosition(position);
}
else if (!dragging && (!Mathf.Approximately(offset, 0f) || !Mathf.Approximately(velocity, 0f)))
else if (!(dragging || scrolling) && (!Mathf.Approximately(offset, 0f) || !Mathf.Approximately(velocity, 0f)))
{
var position = currentPosition;

Expand Down Expand Up @@ -503,13 +575,14 @@ void Update()
}
}

if (!autoScrollState.Enable && dragging && inertia)
if (!autoScrollState.Enable && (dragging || scrolling) && inertia)
{
var newVelocity = (currentPosition - prevPosition) / deltaTime;
velocity = Mathf.Lerp(velocity, newVelocity, deltaTime * 10f);
}

prevPosition = currentPosition;
scrolling = false;
}

float CalculateMovementAmount(float sourcePosition, float destPosition)
Expand Down

0 comments on commit bf3fd36

Please sign in to comment.