本文共 2748 字,大约阅读时间需要 9 分钟。
UI宽度=原来的宽度+(每一个单元格长度+间隙)*(单元格数量-1)一。我们实现的是要翻一页书或者多页书,使用的方法是让ScrollView用它自身长度的单位化比例来实现。
实现这个需求我们首先要知道:
1.需要知道的一些属性值:
content的总长
2.玩家鼠标的开始位置与结束位置:
开始滑动与结束滑动的事件方式。
计算差值:
开始位置-结束位置>0,则右滑。
开始位置-结束位置<0,则左滑。
差值来决定滑动几个单元格。
3.移动一个单元格玩家鼠标需要滑动的距离(半个单元格长度+左偏移量)
测试发现它是一个单元格长度+左偏移量。
4.移动多个单元格玩家鼠标需要滑动的距离。
第一个是单元格长度+左偏移量,之后的每一个滑动都是单元格长度+间隔
滑动一个单元格所占的比例:
一个单元格所在位置中点的长度/Content的总长度
上限值与下限值:防止超过我们的最小长度与最大长度。
public class ScrollPage : MonoBehaviour,IBeginDragHandler,IEndDragHandler{ private RectTransform contentTrans; private float beginMousePositionX; private float endMousePositionX; private ScrollRect scrollRect; public int cellLength; public int spacing; public int leftOffset; private float moveOneItemLength; private Vector3 currentContentLocalPos;//上一次的位置 private Vector3 contentInitPos;//Content初始位置 private Vector2 contentTransSize;//Content初始大小 public int totalItemNum; private int currentIndex; private void Awake() { scrollRect = GetComponent(); contentTrans = scrollRect.content; moveOneItemLength = cellLength + spacing; currentContentLocalPos = contentTrans.localPosition; contentTransSize = contentTrans.sizeDelta; contentInitPos = contentTrans.localPosition; currentIndex = 1; Debug.Log("currentContentLocalPos:" + currentContentLocalPos); } /// /// 通过拖拽与松开来达成翻页效果 /// /// public void OnBeginDrag(PointerEventData eventData) { beginMousePositionX = Input.mousePosition.x; //Debug.Log("beginMousePositionX" + beginMousePositionX); } public void OnEndDrag(PointerEventData eventData) { endMousePositionX = Input.mousePosition.x; // Debug.Log("endMousePositionX" + endMousePositionX); float offSetX = 0; float moveDistance = 0;//当次需要滑动的距离 offSetX = beginMousePositionX - endMousePositionX; Debug.Log("offSetX " + offSetX); if (offSetX > 0)//左滑 { if (currentIndex >= totalItemNum) { return; } moveDistance = -moveOneItemLength; currentIndex++; } else//右滑 { if (currentIndex <= 1) { return; } moveDistance = moveOneItemLength; currentIndex--; } DOTween.To(() => contentTrans.localPosition, lerpValue => contentTrans.localPosition = lerpValue, currentContentLocalPos + new Vector3(moveDistance, 0, 0), 0.5f).SetEase(Ease.OutQuint); currentContentLocalPos += new Vector3(moveDistance, 0, 0); Debug.Log("currentIndex:"+ currentIndex); Debug.Log("currentContentLocalPos:" + currentContentLocalPos); }}
转载地址:http://vcrxo.baihongyu.com/