挂带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);
}
}