热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

unityscrollRect实现按页码翻页效果

这篇文章主要为大家详细介绍了unityscrollRect实现按页码翻页效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了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;
 /// 
 /// 滑动距离超过一页的 (m_dragNum*10)% 则滑动成功
 /// 
 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().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) &#63; -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)&#63;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 

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


推荐阅读
  • 深入解析 Spring Security 用户认证机制
    本文将详细介绍 Spring Security 中用户登录认证的核心流程,重点分析 AbstractAuthenticationProcessingFilter 和 AuthenticationManager 的工作原理。通过理解这些组件的实现,读者可以更好地掌握 Spring Security 的认证机制。 ... [详细]
  • 本文介绍如何在现有网络中部署基于Linux系统的透明防火墙(网桥模式),以实现灵活的时间段控制、流量限制等功能。通过详细的步骤和配置说明,确保内部网络的安全性和稳定性。 ... [详细]
  • 本文探讨了如何通过一系列技术手段提升Spring Boot项目的并发处理能力,解决生产环境中因慢请求导致的系统性能下降问题。 ... [详细]
  • 本文详细介绍如何通过设置SSH密钥来获取连接GitHub远程仓库的权限,包括生成密钥、添加到GitHub账户以及验证连接等步骤。 ... [详细]
  • 本文介绍如何配置SecureCRT以正确显示Linux终端的颜色,并解决中文显示问题。通过简单的步骤设置,可以显著提升使用体验。 ... [详细]
  • 最新计算机专业原创毕业设计参考选题都有源码+数据库是近期作品ling取参考你的选题刚好在下面有,有时间看到机会给您发1ssm资源循环利用2springboot校园考勤系统3ssm防 ... [详细]
  • CentOS 7.2 配置防火墙端口开放
    本文介绍如何在 CentOS 7.2 系统上配置防火墙以开放特定的服务端口,包括 FTP 服务的临时与永久开放方法,以及如何验证配置是否生效。 ... [详细]
  • 本指南详细介绍了如何在同一台计算机上配置多个GitHub账户,并使用不同的SSH密钥进行身份验证,确保每个账户的安全性和独立性。 ... [详细]
  • WinSCP: 跨Windows与Linux系统的高效文件传输解决方案
    本文详细介绍了一款名为WinSCP的开源图形化SFTP客户端,该工具支持SSH协议,适用于Windows操作系统,能够实现与Linux系统之间的文件传输。对于从事嵌入式开发的技术人员来说,掌握WinSCP的使用方法将极大提高工作效率。 ... [详细]
  • 利用SSH隧道实现外网对局域网机器的安全访问
    本文探讨了一种常见的网络配置问题及其解决方案,即如何在外网环境下安全地访问位于局域网内的计算机。特别介绍了使用SSH反向隧道技术来实现这一目标的具体步骤和注意事项。 ... [详细]
  • 在Linux系统上构建Web服务器的详细步骤
    本文详细介绍了如何在Linux系统上搭建Web服务器的过程,包括安装Apache、PHP和MySQL等关键组件,以及遇到的一些常见问题及其解决方案。 ... [详细]
  • 本文详细介绍了如何通过Git Bash在本地仓库与远程仓库之间建立连接并进行同步操作,包括克隆仓库、提交更改和推送更新等步骤。 ... [详细]
  • Windows 环境下安装 Git 并连接 GitHub 的详细步骤
    本文详细介绍了如何在 Windows 系统中安装 Git 工具,并通过配置 SSH 密钥实现与 GitHub 的安全连接。包括下载、安装、环境配置及验证连接等关键步骤。 ... [详细]
  • Redis安全防护深入解析
    本文详细探讨了如何通过指令安全、端口管理和SSL代理等措施有效保护Redis服务的安全性。 ... [详细]
  • Django xAdmin 使用指南(第一部分)
    本文介绍如何在Django项目中集成和使用xAdmin,这是一个增强版的管理界面,提供了比Django默认admin更多的功能。文中详细描述了集成步骤及配置方法。 ... [详细]
author-avatar
啲眼泪17
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有