unity ugui实现整页滑动

来源:互联网 发布:sqlserver 回滚数据 编辑:程序博客网 时间:2024/06/07 01:50
using UnityEngine;
using System.Collections.Generic;
using UnityEngine.EventSystems;
using UnityEngine.UI;
using System;


public class ScrollPage : MonoBehaviour, IBeginDragHandler, IEndDragHandler
{
    ScrollRect rect;
    //页面:0,1,2,3  索引从0开始
    //每页占的比列:0/3=0  1/3=0.333  2/3=0.6666 3/3=1
    //float[] pages = { 0f, 0.333f, 0.6666f, 1f };
    List<float> pages = new List<float>();
    //int currentPageIndex = -1;


    //滑动速度
    public float smooting = 4;


    //滑动的起始坐标
    float targethorizontal = 0;


    //是否拖拽结束
    bool isDrag = false;
    static int index = 0;
    /// <summary>
    /// 用于返回一个页码,-1说明page的数据为0
    /// </summary>
    public System.Action<int, int> OnPageChanged;


    float startime = 0f;
    float delay = 0.1f;
    //bool SlideFactor = true;
    float preX = 0F;
    float endX = 0F;
    // Use this for initialization
    void Start()
    {
        //UpdatePages();
        rect = transform.GetComponent<ScrollRect>();
        //rect.horizontalNormalizedPosition = 0;
        //UpdatePages();      
        startime = Time.time;


    }


    void Update()
    {
        // if (Time.time < startime + delay) return;
        UpdatePages();
        //如果不判断。当在拖拽的时候要也会执行插值,所以会出现闪烁的效果
        //这里只要在拖动结束的时候。在进行插值
        if (!isDrag && pages.Count > 0)
        {


            rect.horizontalNormalizedPosition = Mathf.Lerp(rect.horizontalNormalizedPosition, targethorizontal, Time.deltaTime * smooting);


        }
    }


    public void OnBeginDrag(PointerEventData eventData)
    {
       preX=eventData.position.x;
      //Debug.LogError(preX);
        isDrag = true;
       
    }


    public void OnEndDrag(PointerEventData eventData)
    {
        endX = eventData.position.x;
        //Debug.LogError(endX);
        isDrag = false;


        float posX = rect.horizontalNormalizedPosition;


        // if (SlideFactor&&index == pages.Count - 1) index = pages.Count - 2;
        if (posX > 1 / (3 * (pages.Count - index))&&endX<preX)
        {
            index+=1;
            if (index > pages.Count - 1) {index = pages.Count - 1; }


        }
        if (posX > 1 / (3 * (pages.Count - index)) && endX>preX)
        {
            index-=1;
            if (index < 0) {  index = 0; }
        }
        //index += 1;
        //假设离第一位最近
        //float offset = Mathf.Abs(pages[index] - posX);
        //for (int i = 1; i < pages.Count; i++)
        //{
        //    float temp = Mathf.Abs(pages[i] - posX);
        //    if (temp<0.8f)
        //    {
        //        index+=1;


        //        //保存当前的偏移量
        //        //如果到最后一页。反翻页。所以要保存该值,如果不保存。你试试效果就知道
        //        //offset = temp;
        //    }
        // }


        //if (index != currentPageIndex)
        //{
        //    currentPageIndex = index;
        //   // OnPageChanged(pages.Count, currentPageIndex);
        //}


        /*
         因为这样效果不好。没有滑动效果。比较死板。所以改为插值
         */
        //rect.horizontalNormalizedPosition = page[index];


       // print(index);
        targethorizontal = pages[index];
    }


    void UpdatePages()
    {
        // 获取子对象的数量
        int count = this.rect.content.childCount;
        int temp = 0;
        for (int i = 0; i < count; i++)
        {
            if (this.rect.content.GetChild(i).gameObject.activeSelf)
            {
                temp++;
            }
        }
        count = temp;


        if (pages.Count != count)
        {
            if (count != 0)
            {
                pages.Clear();
                for (int i = 0; i < count; i++)
                {
                    float page = 0;
                    if (count != 1)
                        page = i / ((float)(count - 1));
                    pages.Add(page);
                    // Debug.Log(i.ToString() + " page:" + page.ToString());
                }
            }
            // OnEndDrag(null);
        }
    }
}
0 0
原创粉丝点击