UGUI ScrollView 分页(详细介绍)

首先我们实现分页,有两种,一个是左右分页,一个是上下分页,当然这就会有人说了,上下分页和左右分页,只要看一个代码就够了。确实,不过改的时候也许一个不易发现的地方就可以玩死自己。所以我还是写出来。
废话不多说上代码:

using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using System.Collections.Generic;
using System;

public class MyScrollRectHelper : MonoBehaviour, IBeginDragHandler, IEndDragHandler
{

    private float smooting;                          //滑动速度
    private float normalSpeed = 3;
    private float highSpeed = 10;
    /// <summary>
    /// 每页显示的项目(Btn_1)
    /// </summary>
    private int pageCount = 1;    
    /// <summary>
    /// content
    /// </summary>
    public GameObject Content;
    private ScrollRect sRect;
    /// <summary>
    ///  总页数
    /// </summary>
    private float pageIndex;
    /// <summary>
    /// 是否拖拽结束
    /// </summary>
    private bool isDrag = true;
    /// <summary>
    /// 总页数索引比列 0-1
    /// </summary>
    private List<float> listPageValue = new List<float> { 0 };  //

    /// <summary>
    /// 滑动的目标位置
    /// </summary>
    private float m_targetPos = 0;                                //
    /// <summary>
    /// 当前位置索引
    /// </summary>
    private float nowindex = 0;       
    /// <summary>
    /// 开始索引的位置
    /// </summary>
    private float beginDragPos;
    /// <summary>
    /// 结束索引的位置
    /// </summary>
    private float endDragPos;
    /// <summary>
    /// 灵敏度
    /// </summary>
    private float sensitivity = 0.15f;     
    /// <summary>
    /// 每页的数量
    /// </summary>
    private int onePageCount =8;

    void Awake()
    {
        //获取组件
        sRect = this.GetComponent<ScrollRect>();
        //
        ListPageValueInit();
        //滑度
        smooting = normalSpeed;
    }

    //每页比例
    void ListPageValueInit()
    {
        //总页数       总页数/每页显示的项目item(1) 
        pageIndex = (Content.transform.childCount / pageCount) - 1;
        
        if (Content != null && Content.transform.childCount != 0)
        {
            for (float i = 1; i <= pageIndex; i++)
            {
                listPageValue.Add((i / pageIndex));//设置(写出)页数
            }
        }
    }
    void Update()
    {
        if (!isDrag)
          sRect.verticalNormalizedPosition = Mathf.Lerp(sRect.verticalNormalizedPosition, m_targetPos, Time.deltaTime * smooting);
    }

    /// <summary>
    /// 拖动开始 接口
    /// </summary>
    public void OnBeginDrag(PointerEventData eventData)
    {
        isDrag = true;
        //记录拖拽的起点 
        beginDragPos = sRect.verticalNormalizedPosition;
    }

    /// <summary>
    /// 拖拽结束
    /// </summary>
    public void OnEndDrag(PointerEventData eventData)
    {
        isDrag = false;
        
        //记录放开时的点
        endDragPos = sRect.verticalNormalizedPosition;

        //判断   终点》起点?                            是:终点+灵敏度(换页)        否:终点-灵敏度(不换页)
        endDragPos = endDragPos > (beginDragPos) ? endDragPos + sensitivity : endDragPos - sensitivity;
        int index = 0;

        // 拖动的绝对值   数值决定翻几页
        float offset = Mathf.Abs(listPageValue[index] - endDragPos);    

        //遍历全页数
        for (int i = 1; i < listPageValue.Count; i++) 
        {
            int a = (listPageValue.Count - i);
            //返回绝对值  例如   1.4-1 = 0.43 、 1.4 - 2= 0.6  、 1.4 -3 = 1.6  、 1.4-4 = 3.6f、4.6
            float temp = Mathf.Abs(endDragPos - listPageValue[i]);
            if (temp < offset)
            {
                index = i;
                offset = temp;
            }
        }
        m_targetPos = listPageValue[index];
        nowindex = index;
    }//horizontalNormalizedPosition 0-1 0表示左侧           vertical 0-1 0表示底部


}

第一步:脚本挂在scrollview上,并且将Content(Level_Btns)放上指定位置。

第二步:在Level_Btns挂上组件,如下图
在这里插入图片描述

第三步:在Btn_1 2 3 4 5 6 7 8这些小的组也挂上,如下图
在这里插入图片描述
然后我们在这些Btn里放入图片如图
在这里插入图片描述
在这里插入图片描述
我们就会获得这样一个垂直的scrollview

调整Content的屏幕范围为全屏则会得到下图的效果
在这里插入图片描述
这样我们就实现了翻一页的效果

注意:如果你发现你拖了它还是不翻页,那么点到你的Content(Level_Btns) Inspector面板
在这里插入图片描述
在这里插入图片描述
拉成这样就可以了。
反之,如果你要做水平翻页,就把他反过来,拉成水平就可以了,记得参数也要调回来,当然,水平需要调的脚本参数
字段的 private bool isDrag = true;改成false;

所有的sRect.verticalNormalizedPosition
改成 sRect.horizontalNormalizedPosition

Content面板的
在这里插入图片描述
Scrollview面板的
在这里插入图片描述
如果有什么问题,可以留言,我会尽快回复的~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值