代码相当冗长,仅作自己记录
在此分页上修改的https://blog.csdn.net/qinyuanpei/article/details/49781133
using UnityEngine;
using System.Collections;using System.Collections.Generic;using UnityEngine.UI;public class GridItem { public string cnName; public string usName; public GridItem(string cnN,string usN) { cnName = cnN; usName = usN; }}public class PaginationPanel : MonoBehaviour{ /// <summary> /// 当前页面索引 /// </summary> public int m_PageIndex = 1; /// <summary> /// 总页数 /// </summary> public int m_PageCount = 0; /// <summary> /// 每页元素数 /// </summary> public int m_PerPageCount = 0; /// <summary> /// 元素总个数 /// </summary> public int m_ItemsCount = 0; /// <summary> /// 元素列表 /// </summary> public List<GridItem> m_ItemsList; /// <summary> /// 上一页 /// </summary> public Button m_BtnPrevious; /// <summary> /// 下一页 /// </summary> public Button m_BtnNext; /// <summary> /// 显示当前页数的标签 /// </summary> public Text m_PanelText; public Transform m_FrontPanel; public Transform m_BackPanel; public bool m_IsTouching; [Range(-1,1)] public float m_TouchDelta; public float m_MoveSpeed = 5f; public float m_FadeDistance; public Vector3 m_PrePos; public Vector3 m_CenterPos; public Vector3 m_NextPos; public bool m_DoPrevious; public bool m_DoNext; public float m_CurrAlpha; private bool m_HasPrevious; private bool m_HasNext; private bool m_IsSaveBeforeTouch; public int m_FrontPanelPageIndex; private bool m_CanChangePage; private bool m_IsBackPageIndex; void Start() { InitGUI(); InitItems(); } /// <summary> /// 初始化GUI /// </summary> private void InitGUI() { //m_BtnNext = GameObject.Find("Canvas/Panel/BtnNext").GetComponent<Button>(); //m_BtnPrevious = GameObject.Find("Canvas/Panel/BtnPrevious").GetComponent<Button>(); //m_PanelText = GameObject.Find("Canvas/Panel/Text").GetComponent<Text>(); //为上一页和下一页添加事件 m_BtnNext.onClick.AddListener(() => { OnNextBtnClick(); }); m_BtnPrevious.onClick.AddListener(() => { OnPreviousBtnClick(); }); m_PerPageCount = m_FrontPanel.childCount; m_FadeDistance = Mathf.Abs(m_FrontPanel.localPosition.y - m_BackPanel.localPosition.y); m_PrePos = m_FrontPanel.localPosition; m_PrePos.y += m_FadeDistance; m_NextPos = m_FrontPanel.localPosition; m_NextPos.y -= m_FadeDistance; m_CenterPos = m_FrontPanel.localPosition; m_CanChangePage = true; m_FrontPanelPageIndex = 1; } /// <summary> /// 初始化元素 /// </summary> private void InitItems() { //准备一个存储着12生肖信息的数组 GridItem[] items = new GridItem[] { new GridItem("鼠","Mouse"), new GridItem("牛","Ox"), new GridItem("虎","Tiger"), new GridItem("兔","Rabbit"), new GridItem("龙","Dragon"), new GridItem("蛇","Snake"), new GridItem("马","Horse"), new GridItem("羊","Goat"), new GridItem("猴","Monkey"), new GridItem("鸡","Rooster"), new GridItem("狗","Dog"), new GridItem("猪","Pig") }; //利用12生肖数组来随机生成列表 m_ItemsList = new List<GridItem>(); for (int i = 0; i < items.Length; i++) { m_ItemsList.Add(items[i]); } //计算元素总个数 m_ItemsCount = m_ItemsList.Count; //计算总页数 m_PageCount = (m_ItemsCount % m_PerPageCount) == 0 ? m_ItemsCount / m_PerPageCount : (m_ItemsCount / m_PerPageCount) + 1; BindPage(m_FrontPanel, m_PageIndex); //更新界面页数 m_PanelText.text = string.Format("{0}/{1}", m_PageIndex.ToString(), m_PageCount.ToString()); } private void Update() { if (m_IsTouching) { if (!m_IsSaveBeforeTouch) { m_IsSaveBeforeTouch = true; m_FrontPanelPageIndex = m_PageIndex; } if (m_TouchDelta > 0) { if (!m_HasPrevious && m_FrontPanelPageIndex > 1) { m_HasNext = false; m_HasPrevious = true; TouchPrevious(); } if (m_DoPrevious) { m_IsBackPageIndex = false; m_BackPanel.localPosition = Vector3.Lerp(m_PrePos, m_CenterPos, Mathf.Abs(m_TouchDelta)); m_BackPanel.GetComponent<CanvasGroup>().alpha = Mathf.Abs(m_TouchDelta); } m_FrontPanel.localPosition = Vector3.Lerp(m_CenterPos, m_NextPos, Mathf.Abs(m_TouchDelta)); m_FrontPanel.GetComponent<CanvasGroup>().alpha = 1 - Mathf.Abs(m_TouchDelta); } else if (m_TouchDelta < 0) { if (!m_HasNext && m_FrontPanelPageIndex < m_PageCount) { m_HasNext = true; m_HasPrevious = false; TouchNext(); } if (m_DoNext) { m_IsBackPageIndex = false; m_BackPanel.localPosition = Vector3.Lerp(m_NextPos, m_CenterPos, Mathf.Abs(m_TouchDelta)); m_BackPanel.GetComponent<CanvasGroup>().alpha = Mathf.Abs(m_TouchDelta); } m_FrontPanel.localPosition = Vector3.Lerp(m_CenterPos, m_PrePos, Mathf.Abs(m_TouchDelta)); m_FrontPanel.GetComponent<CanvasGroup>().alpha = 1 - Mathf.Abs(m_TouchDelta); } } else { m_HasNext = false; m_HasPrevious = false; m_IsSaveBeforeTouch = false; float a = Mathf.Abs(m_FrontPanel.localPosition.y - m_CenterPos.y) / m_FadeDistance; m_CurrAlpha = a; if (m_TouchDelta >= 0.5f) { //float a = Mathf.Abs(m_FrontPanel.localPosition.y - m_CenterPos.y) / m_FadeDistance; if (m_DoPrevious) { m_BackPanel.localPosition = Vector3.Lerp(m_BackPanel.localPosition, m_CenterPos, m_MoveSpeed * Time.deltaTime); m_BackPanel.GetComponent<CanvasGroup>().alpha = a; m_FrontPanel.localPosition = Vector3.Lerp(m_FrontPanel.localPosition, m_NextPos, m_MoveSpeed * Time.deltaTime); m_FrontPanel.GetComponent<CanvasGroup>().alpha = 1 - a; if (1 - a < 0.01f) { m_TouchDelta = 0; SwitchPanel(); } } else { m_TouchDelta = 0; } } else if (m_TouchDelta <= -0.5f) { //float a = Mathf.Abs(m_FrontPanel.localPosition.y - m_CenterPos.y) / m_FadeDistance; if (m_DoNext) { m_BackPanel.localPosition = Vector3.Lerp(m_BackPanel.localPosition, m_CenterPos, m_MoveSpeed * Time.deltaTime); m_BackPanel.GetComponent<CanvasGroup>().alpha = a; m_FrontPanel.localPosition = Vector3.Lerp(m_FrontPanel.localPosition, m_PrePos, m_MoveSpeed * Time.deltaTime); m_FrontPanel.GetComponent<CanvasGroup>().alpha = 1 - a; if (1 - a < 0.01f) { m_TouchDelta = 0; SwitchPanel(); } } else { m_TouchDelta = 0; } } else { //float a = Mathf.Abs(m_FrontPanel.localPosition.y - m_CenterPos.y) / m_FadeDistance; if (m_DoPrevious) { if (!m_IsBackPageIndex) { m_IsBackPageIndex = true; m_PageIndex = m_FrontPanelPageIndex; } if (m_PageIndex < m_PageCount && m_PageIndex > 1) { m_BackPanel.localPosition = Vector3.Lerp(m_BackPanel.localPosition, m_PrePos, m_MoveSpeed * Time.deltaTime); m_BackPanel.GetComponent<CanvasGroup>().alpha = a; } } else if (m_DoNext) { if (!m_IsBackPageIndex) { m_IsBackPageIndex = true; m_PageIndex = m_FrontPanelPageIndex; } if (m_PageIndex < m_PageCount && m_PageIndex > 1) { m_BackPanel.localPosition = Vector3.Lerp(m_BackPanel.localPosition, m_NextPos, m_MoveSpeed * Time.deltaTime); m_BackPanel.GetComponent<CanvasGroup>().alpha = a; } } m_FrontPanel.localPosition = Vector3.Lerp(m_FrontPanel.localPosition,m_CenterPos, m_MoveSpeed * Time.deltaTime); m_FrontPanel.GetComponent<CanvasGroup>().alpha = 1 - a; if (m_TouchDelta != 0 && a < 0.01f) { m_TouchDelta = 0; m_DoNext = false; m_DoPrevious = false; m_CanChangePage = true; } } } } private void SwitchPanel() { m_DoPrevious = false; m_DoNext = false; Transform temp = m_FrontPanel; m_FrontPanel = m_BackPanel; m_BackPanel = temp; m_CanChangePage = true; } public void OnNextBtnClick() { if (!m_CanChangePage) return; m_TouchDelta = -0.6f; Next(); } /// <summary> /// 下一页 /// </summary> public void Next() { if (m_PageCount <= 0) return; //最后一页禁止向后翻页 if (m_PageIndex >= m_PageCount) return; m_CanChangePage = false; m_PageIndex += 1; if (m_PageIndex >= m_PageCount) m_PageIndex = m_PageCount; m_BackPanel.localPosition = m_NextPos; BindPage(m_BackPanel, m_PageIndex); m_DoNext = true; m_DoPrevious = false; //更新界面页数 m_PanelText.text = string.Format("{0}/{1}", m_PageIndex.ToString(), m_PageCount.ToString()); } /// <summary> /// 下一页 /// </summary> public void TouchNext() { if (m_PageCount <= 0) return; //最后一页禁止向后翻页 if (m_FrontPanelPageIndex >= m_PageCount) return; m_CanChangePage = false; m_PageIndex = m_FrontPanelPageIndex + 1; if (m_PageIndex >= m_PageCount) m_PageIndex = m_PageCount; m_BackPanel.localPosition = m_NextPos; BindPage(m_BackPanel, m_PageIndex); m_DoNext = true; m_DoPrevious = false; //更新界面页数 m_PanelText.text = string.Format("{0}/{1}", m_PageIndex.ToString(), m_PageCount.ToString()); } public void OnPreviousBtnClick() { if (!m_CanChangePage) return; m_TouchDelta = 0.6f; Previous(); } /// <summary> /// 上一页 /// </summary> public void Previous() { if (m_PageCount <= 0) return; //第一页时禁止向前翻页 if (m_PageIndex <= 1) return; m_CanChangePage = false; m_PageIndex -= 1; if (m_PageIndex < 1) m_PageIndex = 1; m_BackPanel.localPosition = m_PrePos; BindPage(m_BackPanel, m_PageIndex); m_DoPrevious = true; m_DoNext = false; //更新界面页数 m_PanelText.text = string.Format("{0}/{1}", m_PageIndex.ToString(), m_PageCount.ToString()); } /// <summary> /// 上一页 /// </summary> public void TouchPrevious() { if (m_PageCount <= 0) return; //第一页时禁止向前翻页 if (m_FrontPanelPageIndex <= 1) return; m_CanChangePage = false; m_PageIndex = m_FrontPanelPageIndex -1; if (m_PageIndex < 1) m_PageIndex = 1; m_BackPanel.localPosition = m_PrePos; BindPage(m_BackPanel, m_PageIndex); m_DoPrevious = true; m_DoNext = false; //更新界面页数 m_PanelText.text = string.Format("{0}/{1}", m_PageIndex.ToString(), m_PageCount.ToString()); } /// <summary> /// 绑定指定索引处的页面元素 /// </summary> /// <param name="index">页面索引</param> private void BindPage(Transform tran,int index) { //列表处理 if (m_ItemsList == null || m_ItemsCount <= 0) return; //索引处理 if (index < 0 || index > m_ItemsCount) return; //按照元素个数可以分为1页和1页以上两种情况 if (m_PageCount == 1) { int canDisplay = 0; for (int i = m_PerPageCount; i > 0; i--) { if (canDisplay < m_PerPageCount && canDisplay< m_ItemsList.Count) { BindGridItem(tran.GetChild(canDisplay), m_ItemsList[m_PerPageCount - i]); tran.GetChild(canDisplay).gameObject.SetActive(true); } else { //对超过canDispaly的物体实施隐藏 tran.GetChild(canDisplay).gameObject.SetActive(false); } canDisplay += 1; } } else if (m_PageCount > 1) { //1页以上需要特别处理的是最后1页 //和1页时的情况类似判断最后一页剩下的元素数目 //第1页时显然剩下的为12所以不用处理 if (index == m_PageCount) { int canDisplay = 0; for (int i = m_PerPageCount; i > 0; i--) { //最后一页剩下的元素数目为 m_ItemsCount - 12 * (index-1) if (canDisplay < m_ItemsCount - m_PerPageCount * (index - 1)) { BindGridItem(tran.GetChild(canDisplay), m_ItemsList[m_PerPageCount * index - i]); tran.GetChild(canDisplay).gameObject.SetActive(true); } else { //对超过canDispaly的物体实施隐藏 tran.GetChild(canDisplay).gameObject.SetActive(false); } canDisplay += 1; } } else { for (int i = m_PerPageCount; i > 0; i--) { BindGridItem(tran.GetChild(m_PerPageCount - i), m_ItemsList[m_PerPageCount * index - i]); tran.GetChild(m_PerPageCount - i).gameObject.SetActive(true); } } } } /// <summary> /// 加载一个Sprite /// </summary> /// <param name="assetName">资源名称</param> private Sprite LoadSprite(string assetName) { Texture texture = (Texture)Resources.Load(assetName); Sprite sprite = Sprite.Create((Texture2D)texture, new Rect(0, 0, texture.width, texture.height), new Vector2(0.5f, 0.5f)); return sprite; } /// <summary> /// 将一个GridItem实例绑定到指定的Transform上 /// </summary> /// <param name="trans"></param> /// <param name="gridItem"></param> private void BindGridItem(Transform trans, GridItem gridItem) { //trans.GetComponent<Image>().sprite = LoadSprite(gridItem.ItemSprite); trans.GetComponent<Text>().text = gridItem.cnName; }}