zoukankan      html  css  js  c++  java
  • UGUI 分页渐变居中效果

    代码相当冗长,仅作自己记录

    在此分页上修改的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;
            
        }
    }

  • 相关阅读:
    讲课专用——线段树——最长上升子序列
    讲课专用——线段树——最长连续空位
    讲课专用——线段树——BSS
    求背景图
    致备战noip2018的勇士
    TNS-12547 Linux Error: 104: Connection reset by pe (转载)
    清理Oracle安装目录里的一些日志信息
    tmp_table_size
    11gr2 alert日志中报TNS-12535 TNS-00505原因及解决方法 (转载)
    systemstate dump 介绍
  • 原文地址:https://www.cnblogs.com/alps/p/9032724.html
Copyright © 2011-2022 走看看