/**
         * Get the offset to move to in order to snap to the page
         */
        public float SnapOffsetForPage(int pageIndex, SnapEdge edge)
        {
            var offset = PdfFile.GetPageOffset(pageIndex, Zoom);

            float length     = IsSwipeVertical ? Height : Width;
            var   pageLength = PdfFile.GetPageLength(pageIndex, Zoom);

            switch (edge)
            {
            case SnapEdge.Center:
                offset = offset - length / 2f + pageLength / 2f;
                break;

            case SnapEdge.End:
                offset = offset - length + pageLength;
                break;

            case SnapEdge.Start:
                break;

            case SnapEdge.None:
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(edge), edge, null);
            }

            return(offset);
        }
Пример #2
0
    private IEnumerator SnapTo(SnapEdge edge)
    {
        yield return(new WaitUntil(() => scrolling == false));

        var closestCard = GetClosestCard(edge);

        if (!scrolling)
        {
            LerpTo(closestCard, edge);
        }
    }
Пример #3
0
    private void LerpTo(RectTransform card, SnapEdge edge)
    {
        RectTransform target       = (edge == SnapEdge.Top) ? top : bottom;
        var           yDistance    = card.position.y - target.position.y;
        var           lerpDistance = new Vector3(0f, -yDistance, 0f);

        if (yDistance < 0)
        {
            lerpDistance -= new Vector3(0f, distanceBetweenTwoRows, 0f);
        }

        lerpDistance += new Vector3(0f, distanceBetweenTwoRows / 2, 0f);
        var rect = cardLibraryController.GetComponent <RectTransform>();

        StartCoroutine(MoveRectTransform(rect, lerpDistance, 1f));
    }
Пример #4
0
    private RectTransform GetClosestCard(SnapEdge edge)
    {
        RectTransform target                = (edge == SnapEdge.Top) ? top : bottom;
        RectTransform closestCard           = null;
        float         closestDistanceSquare = Mathf.Infinity;

        foreach (RectTransform card in cardRects)
        {
            Vector3 directionToTarget = target.position - card.position;
            float   directionSquared  = directionToTarget.sqrMagnitude;

            if (directionSquared < closestDistanceSquare)
            {
                closestCard           = card;
                closestDistanceSquare = directionSquared;
            }
        }
        return(closestCard);
    }
Пример #5
0
 public void Snap(SnapEdge edge)
 {
     StopAllCoroutines();
     StartCoroutine(SnapTo(edge));
 }