/** * 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); }
private IEnumerator SnapTo(SnapEdge edge) { yield return(new WaitUntil(() => scrolling == false)); var closestCard = GetClosestCard(edge); if (!scrolling) { LerpTo(closestCard, edge); } }
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)); }
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); }
public void Snap(SnapEdge edge) { StopAllCoroutines(); StartCoroutine(SnapTo(edge)); }