private bool WillSetScrollToEnd() { ScrollTo to = ScrollTo.None; if (viewRectTrans.rect.height <= scrollTrans.rect.height) { to = ScrollTo.Bottom; } else if (this.pivot.y == 1) { if (this.scrollRect.verticalNormalizedPosition > 0.99f) { to = ScrollTo.Bottom; } } else if (this.pivot.y == 0) { if (this.scrollRect.verticalNormalizedPosition < 0.01f) { to = ScrollTo.Bottom; } } if (to != ScrollTo.None) { if (gameObject.activeInHierarchy) { StartCoroutine(StartScrolling(to)); } return(true); } return(false); }
public void AttemptToScrollTo(ScrollTo scrollTo) { if (listView.Items.Count > 0) { object showLVItem = listView.Items[(scrollTo == ScrollTo.Bottom) ? listView.Items.Count - 1 : 0]; listView.ScrollIntoView(showLVItem); } }
public void ScrollToItem(int index, ScrollTo to) { prevScrollPosition = GetCurrentPosition(); var anchoredPosition = GetScrollToPosition(index, to); scrollRect.content.anchoredPosition = anchoredPosition; UpdateScroll(); OnMoveEnd(); }
private IEnumerator StartScrolling(ScrollTo to) { yield return(new WaitForEndOfFrame()); if (to == ScrollTo.Bottom) { this.ScrollToEnd(); } else if (to == ScrollTo.Top) { this.ScrollToBegin(); } }
public IObservable <Unit> ScrollToItem(int index, ScrollTo to, float duration, Ease ease = Ease.Unset) { prevScrollPosition = GetCurrentPosition(); var targetPosition = GetScrollToPosition(index, to); var currentPosition = scrollRect.content.anchoredPosition; if (centerToTween != null) { centerToTween.Kill(); centerToTween = null; } switch (direction) { case Direction.Vertical: centerToTween = DOTween.To(() => currentPosition.y, x => scrollRect.content.anchoredPosition = Vector.SetY(scrollRect.content.anchoredPosition, x), targetPosition.y, duration) .SetEase(ease); break; case Direction.Horizontal: centerToTween = DOTween.To(() => currentPosition.x, x => scrollRect.content.anchoredPosition = Vector.SetX(scrollRect.content.anchoredPosition, x), targetPosition.x, duration) .SetEase(ease); break; } if (centerToTween == null) { return(Observable.ReturnUnit()); } centerToTween.Play(); return(Observable.FromMicroCoroutine(() => WaitTweenEnd()).AsUnitObservable()); }
private Vector2 GetScrollToPosition(int index, ScrollTo to) { var scrollToPosition = GetItemScrollToPosition(index); var scrollToOffset = itemSize * 0.5f + edgeSpacing; switch (direction) { case Direction.Vertical: { var contentHeight = scrollRect.content.rect.height; var scrollHeight = scrollRectTransform.rect.height; var top = -contentHeight * 0.5f + scrollHeight * 0.5f; var bottom = contentHeight * 0.5f - scrollHeight * 0.5f; switch (to) { case ScrollTo.First: scrollToPosition.y += scrollHeight * 0.5f; break; case ScrollTo.Last: scrollToPosition.y -= scrollHeight * 0.5f; break; } if (top < scrollToPosition.y + scrollToOffset && scrollToPosition.y - scrollToOffset < bottom || scrollType == ScrollType.Loop) { switch (to) { case ScrollTo.First: scrollToPosition.y -= scrollToOffset; break; case ScrollTo.Last: scrollToPosition.y += scrollToOffset; break; } } if (scrollType == ScrollType.Limited) { scrollToPosition.y = Mathf.Clamp(scrollToPosition.y, top, bottom); } } break; case Direction.Horizontal: { var contentWidth = scrollRect.content.rect.width; var scrollWidth = scrollRectTransform.rect.width; var left = -contentWidth * 0.5f + scrollWidth * 0.5f; var right = contentWidth * 0.5f - scrollWidth * 0.5f; switch (to) { case ScrollTo.First: scrollToPosition.x -= scrollWidth * 0.5f; break; case ScrollTo.Last: scrollToPosition.x += scrollWidth * 0.5f; break; } if (left < scrollToPosition.x + scrollToOffset && scrollToPosition.x - scrollToOffset < right || scrollType == ScrollType.Loop) { switch (to) { case ScrollTo.First: scrollToPosition.x += scrollToOffset; break; case ScrollTo.Last: scrollToPosition.x -= scrollToOffset; break; } } if (scrollType == ScrollType.Limited) { scrollToPosition.x = Mathf.Clamp(scrollToPosition.x, left, right); } } break; } return(scrollToPosition); }