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

 

转载于:https://www.cnblogs.com/HelloUnity/p/5455124.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值