unity scrollRect实现按页码翻页效果

 更新时间:2020年04月18日 08:54:38   作者:liu_sanad  
这篇文章主要为大家详细介绍了unity scrollRect实现按页码翻页效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了unity实现按页码翻页效果的具体代码,供大家参考,具体内容如下

用来做背包 商店的按页翻页功能,先上效果图

其中,dragNum 表示的是 如果为3,便是滑动距离超过当前页面宽度的百分之三十位成功

connect表示 scrollRect下connet的大小

然后是函数的初始化方法 这里提供了两个方法  一个是直接提供页数 参数分别代表 总页数,要显示的页数 以及切换到要显示的页数是否播放滑动动画

以及当时用来做背包、商店的方法2

和上面不用的是传入的是物品的数量以及每页显示格子数量的vector2 是否需要改变connect的大小 (需要提前把connect的大小设置为一页的大小)以及打开时显示的页数

思路大致如下 继承 IBeginDragHandler, IEndDragHandler两个接口

在begin时将需要的两个参数 scrollNeedMove 以及scrollTargetValue 置位默认值

在end时计算

具体代码如下

using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.EventSystems;
public class ScrollPageTool : MonoBehaviour, IBeginDragHandler, IEndDragHandler
{

 public Button pageLastButton;
 public Button pageNextButton;
 public Text pageNumText;
 public GridLayoutGroup itemConnect;
 [SerializeField]
 private bool buttonPageEnable;
 private int m_nowPage;//从0开始
 private int m_pageCount;
 /// <summary>
 /// 滑动距离超过一页的 (m_dragNum*10)% 则滑动成功
 /// </summary>
 public int m_dragNum;
 private float m_pageAreaSize;
 private const float SCROLL_SMOOTH_TIME = 0.2F;
 private const float SCROLL_MOVE_SPEED = 1F;
 private float scrollMoveSpeed = 0f;
 private bool scrollNeedMove = false;
 private float scrollTargetValue;
 public ScrollRect scrollRect;
 
 private bool isRegistEvent = false;
 
 public bool SetButtonStatus
 {
 set
 {
 buttonPageEnable = value;
 pageLastButton.interactable = buttonPageEnable && pageLastButton.interactable;
 pageNextButton.interactable = buttonPageEnable && pageNextButton.interactable;
 }
 }
 public void InitManager(int _allItemNum, Vector2 pageItemSize, bool isNeedChangeSize = true, int pageNum = 0,bool isShowAnim=false)
 {
 RegistEvent();
 int _pageItemNum = (int)(pageItemSize.x * pageItemSize.y);
 m_pageCount = (_allItemNum / _pageItemNum) + ((_allItemNum % _pageItemNum == 0) ? 0 : 1);
 m_pageAreaSize = 1f / (m_pageCount - 1);
 ChangePage(pageNum);
 if (isNeedChangeSize)
 itemConnect.GetComponent<RectTransform>().sizeDelta = new Vector2((itemConnect.cellSize.x * pageItemSize.x + itemConnect.spacing.x * pageItemSize.x) * m_pageCount,
 itemConnect.padding.top + itemConnect.padding.bottom + itemConnect.cellSize.y * pageItemSize.y + (pageItemSize.y - 1) * itemConnect.spacing.y);
 }
 
 public void InitManager(int pageNum, int targetPage = 0, bool isShowAnim = false)
 {
 RegistEvent();
 m_pageCount = pageNum;
 ChangePage(targetPage, isShowAnim);
 }
 
 private void RegistEvent()
 {
 if (isRegistEvent)
 return;
 isRegistEvent = true;
 if (pageLastButton != null)
 pageLastButton.onClick.AddListener(delegate { Paging(-1); });
 if (pageNextButton != null)
 pageNextButton.onClick.AddListener(delegate { Paging(1); });
 }
 
 private void Paging(int num)
 {
 //maxNum-1,从0开始
 num = (num < 0) ? -1 : 1;
 int temp = Mathf.Clamp(m_nowPage + num, 0, m_pageCount - 1);
 if (m_nowPage == temp)
 return;
 ChangePage(temp);
 }
 void Update()
 {
 ScrollControl();
 }
 
 public int GetPageNum { get { return m_nowPage; } }
 //按页翻动
 private void ScrollControl()
 {
 if (!scrollNeedMove)
 return;
 if (Mathf.Abs(scrollRect.horizontalNormalizedPosition - scrollTargetValue) < 0.01f)
 {
 scrollRect.horizontalNormalizedPosition = scrollTargetValue;
 scrollNeedMove = false;
 return;
 }
 scrollRect.horizontalNormalizedPosition = Mathf.SmoothDamp(scrollRect.horizontalNormalizedPosition, scrollTargetValue, ref scrollMoveSpeed, SCROLL_SMOOTH_TIME);
 }
 
 public void OnBeginDrag(PointerEventData eventData)
 {
 scrollNeedMove = false;
 scrollTargetValue = 0;
 }
 public void OnEndDrag(PointerEventData eventData)
 {
 int tempPage = m_nowPage;
 
 int num=(((scrollRect.horizontalNormalizedPosition - (m_nowPage * m_pageAreaSize))>=0)?1:-1);
 
 if(Mathf.Abs(scrollRect.horizontalNormalizedPosition - (m_nowPage * m_pageAreaSize))>= (m_pageAreaSize / 10f) * m_dragNum)
 {
 tempPage+=num;
 
 }
 ChangePage(tempPage);
 }
 
 public void ChangePage(int pageNum, bool isShowAnim = true)
 {
 if (pageNum >= m_pageCount)
 pageNum = m_pageCount - 1;
 if (pageNum < 0)
 pageNum = 0;
 
 m_nowPage = pageNum;
 ChangePageText(pageNum);
 if (isShowAnim)
 {
 scrollTargetValue = m_nowPage * m_pageAreaSize;
 scrollNeedMove = true;
 scrollMoveSpeed = 0;
 }
 else
 {
 scrollRect.horizontalNormalizedPosition = m_nowPage * m_pageAreaSize;
 }
 ChangePageText(m_nowPage);
 }
 
 public void ChangePageText(int num)
 {
 int maxPageTo0Start = m_pageCount - 1;
 m_nowPage = Mathf.Clamp(num, 0, maxPageTo0Start);
 
 if (pageNumText != null)
 pageNumText.text = (m_nowPage + 1).ToString() + "/" + m_pageCount.ToString();
 
 //only one page
 if (maxPageTo0Start == 0)
 {
 scrollRect.enabled = false;
 pageLastButton.interactable = false;
 pageNextButton.interactable = false;
 return;
 }
 else
 {
 pageLastButton.interactable = true;
 pageNextButton.interactable = true;
 scrollRect.enabled = true;
 }
 SetButtonStatus = buttonPageEnable;
 if (!buttonPageEnable)
 return;
 
 if (m_nowPage == 0 && pageLastButton.interactable)
 pageLastButton.interactable = false;
 if (m_nowPage >= maxPageTo0Start && pageNextButton.interactable)
 pageNextButton.interactable = false;
 if (m_nowPage > 0 && (!pageLastButton.interactable))
 pageLastButton.interactable = true;
 if (m_nowPage < maxPageTo0Start && (!pageNextButton.interactable))
 pageNextButton.interactable = true;
 
 
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • C#实现DataList里面嵌套DataList的折叠菜单

    C#实现DataList里面嵌套DataList的折叠菜单

    这篇文章主要介绍了C#实现DataList里面嵌套DataList的折叠菜单,以实例形式详细分析了DataList嵌套实现折叠菜单所涉及的JavaScript、HTML与C#相关使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-11-11
  • C#实现win10 uwp 右击浮出窗在点击位置

    C#实现win10 uwp 右击浮出窗在点击位置

    本文主要让MenuFlyout出现在我们右击位置。我们建一个ListView,然后绑定后台,在我们ListView要右击显示我们的浮出,要求我们的浮出在我们点击位置
    2016-10-10
  • 基于集合的子集与集合的全排列的相关问题

    基于集合的子集与集合的全排列的相关问题

    本篇文章介绍了,集合的子集与集合的全排列的相关系列问题说明,需要的朋友参考下
    2013-05-05
  • C#使用ADO.Net连接数据库与DbProviderFactory实现多数据库访问

    C#使用ADO.Net连接数据库与DbProviderFactory实现多数据库访问

    这篇文章介绍了C#使用ADO.Net连接数据库与DbProviderFactory实现多数据库访问的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • C#的WebBrowser的操作与注意事项介绍

    C#的WebBrowser的操作与注意事项介绍

    C#的WebBrowser的操作与注意事项介绍,需要的朋友可以参考一下
    2013-03-03
  • C#匿名委托与Lambda表达式详解

    C#匿名委托与Lambda表达式详解

    这篇文章主要为大家详细介绍了C#匿名委托与Lambda表达式的相关资料,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • c#通过DES加密算法加密大文件的方法

    c#通过DES加密算法加密大文件的方法

    这篇文章主要介绍了c#通过DES加密算法加密大文件的方法,涉及C#文件操作与DES加密的相关技巧,需要的朋友可以参考下
    2015-05-05
  • 详解Unity中Mask和RectMask2D组件的对比与测试

    详解Unity中Mask和RectMask2D组件的对比与测试

    本篇文章给大家介绍Unity中Mask和RectMask2D组件的对比与测试,包括组件用法及RectMask2D的基本用法,通过Mask的原理分析实例代码相结合给大家讲解的非常详细,需要的朋友参考下吧
    2021-06-06
  • C# OpenCvSharp实现图片批量改名

    C# OpenCvSharp实现图片批量改名

    这篇文章主要为大家详细介绍了C#如何结合OpenCvSharp实现图片批量改名功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-03-03
  • C#实现发送手机验证码功能

    C#实现发送手机验证码功能

    之前基于c#实现手机发送验证码功能很复杂,真正做起来也就那回事,不过就是一个post请求就可以实现的东西,今天小编把思路分享到脚本之家平台,供大家参考下
    2017-06-06

最新评论