Пример #1
0
        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);
        }
Пример #2
0
        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);
            }
        }
Пример #3
0
        public void ScrollToItem(int index, ScrollTo to)
        {
            prevScrollPosition = GetCurrentPosition();

            var anchoredPosition = GetScrollToPosition(index, to);

            scrollRect.content.anchoredPosition = anchoredPosition;

            UpdateScroll();

            OnMoveEnd();
        }
Пример #4
0
        private IEnumerator StartScrolling(ScrollTo to)
        {
            yield return(new WaitForEndOfFrame());

            if (to == ScrollTo.Bottom)
            {
                this.ScrollToEnd();
            }
            else if (to == ScrollTo.Top)
            {
                this.ScrollToBegin();
            }
        }
Пример #5
0
        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());
        }
Пример #6
0
        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);
        }