NGUI翻页
挂带UIScrollView上
结构:
UIScrollView
--Grid
----Item
目前只处理计算了UIGrid
代码有冗余,仅为记录思路。
using UnityEngine; using System.Collections; public class TurnPage : MonoBehaviour { public UIButton btn_leftOrTop; public UIButton btn_rightOrButtom; public int m_RowOrLineNum; // 当前界面显示的行数或者列数 public float strength = 8f; private UIScrollView m_scrollView; private Vector2 m_initialPosition; // scroll初始位置 private UIGrid grid; private Bounds itemBounds; private float allRowsNum; // 总共有多少列(行) private float allPagesNum; // 总共有多少页 private float pageOffset; // 每页的偏移量 private void Start() { UIManager.SetButtonEventHandler(btn_leftOrTop.gameObject, EnumButtonEvent.OnClick, OnTurnLeftOrTop, 0, 0); UIManager.SetButtonEventHandler(btn_rightOrButtom.gameObject, EnumButtonEvent.OnClick, OnTurnRightOrButtom, 0, 0); btn_leftOrTop.enabled = false; btn_rightOrButtom.enabled = false; } public IEnumerator DelayInit() { yield return new WaitForSeconds(0.5f); OnInit(); } public void OnInit() { m_initialPosition = transform.localPosition; // 记录开始位置 m_scrollView = this.GetComponent<UIScrollView>();// 取到scroll // 处理UIGrid grid = this.GetComponentInChildren<UIGrid>(); if (grid == null) return; itemBounds = NGUIMath.CalculateRelativeWidgetBounds(grid.GetChild(1).gameObject.transform); // 默认取第一个的子物体 switch (m_scrollView.movement) { case UIScrollView.Movement.Horizontal: CalInitValue(grid.cellWidth, itemBounds.size.x, m_scrollView.bounds.size.x); break; case UIScrollView.Movement.Vertical: CalInitValue(grid.cellHeight, itemBounds.size.y, m_scrollView.bounds.size.y); break; default: break; } btn_leftOrTop.enabled = true; btn_rightOrButtom.enabled = true; } private void CalInitValue(float gridCellValue, float itemBoundsSize, float scrollBoundsSize) { // 计算总共有多少行 float cutSize = gridCellValue - itemBoundsSize; allRowsNum = (scrollBoundsSize + cutSize) / gridCellValue; allPagesNum = allRowsNum / m_RowOrLineNum;// 计算总共有多少页 pageOffset = (scrollBoundsSize + cutSize) / allRowsNum * m_RowOrLineNum; // 计算每页的偏移量 } private void OnTurnLeftOrTop(ButtonScript obj, object args, int param1, int param2) { Turn(false); } private void OnTurnRightOrButtom(ButtonScript obj, object args, int param1, int param2) { Turn(true); } private void Turn(bool forward) { float currPage; float tempAllPage; switch (m_scrollView.movement) { case UIScrollView.Movement.Horizontal: currPage = GetCurrPage(forward, transform.localPosition.x); tempAllPage = allPagesNum; tempAllPage -= currPage; float localPositionY = m_scrollView.transform.localPosition.y; if (tempAllPage < 1) { float movedX = (allRowsNum - m_RowOrLineNum) * (grid.cellWidth); Vector3 toPositionX = new Vector2(-movedX, localPositionY); SpringPanel.Begin(m_scrollView.panel.cachedGameObject, toPositionX, strength); m_scrollView.panel.clipOffset.Set(-transform.localPosition.x, m_scrollView.panel.clipOffset.y); } else { float movedX = currPage * grid.cellWidth * m_RowOrLineNum; Vector3 toPositionX = new Vector2(-movedX, localPositionY); SpringPanel.Begin(m_scrollView.panel.cachedGameObject, toPositionX, strength); m_scrollView.panel.clipOffset.Set(-transform.localPosition.x, m_scrollView.panel.clipOffset.y); } break; case UIScrollView.Movement.Vertical: currPage = GetCurrPage(forward, transform.localPosition.y); tempAllPage = allPagesNum; tempAllPage -= currPage; float localPositionX = m_scrollView.transform.localPosition.x; if (tempAllPage < 1) { float movedY = (allRowsNum - m_RowOrLineNum) * (grid.cellHeight); Vector3 toPositionY = new Vector2(localPositionX, movedY); SpringPanel.Begin(m_scrollView.panel.cachedGameObject, toPositionY, strength); m_scrollView.panel.clipOffset.Set(transform.localPosition.x, -m_scrollView.panel.clipOffset.y); } else { float movedY = currPage * grid.cellHeight * m_RowOrLineNum; Vector3 toPositionY = new Vector2(localPositionX, movedY); SpringPanel.Begin(m_scrollView.panel.cachedGameObject, toPositionY, strength); m_scrollView.panel.clipOffset.Set(transform.localPosition.x, -m_scrollView.panel.clipOffset.y); } break; } } private float GetCurrPage(bool forward, float positionValue) { float currPageNum = Mathf.Abs(positionValue / pageOffset); if (forward) currPageNum += 1; else { currPageNum -= 1; if (currPageNum < 0) currPageNum = 0; } return currPageNum; } private void OnDestroy() { UIManager.RemoveButtonEventHandler(btn_leftOrTop.gameObject, EnumButtonEvent.OnClick); UIManager.RemoveButtonEventHandler(btn_rightOrButtom.gameObject, EnumButtonEvent.OnClick); } }