unity scrollRect实现按页码翻页效果
作者:liu_sanad 发布时间:2021-10-11 11:52:43
标签:unity,翻页
本文实例为大家分享了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;
}
}
来源:https://blog.csdn.net/liu_sanad/article/details/81131894


猜你喜欢
- 产品在测试过程中发现一个bug,就是测试人员不停的疯狂的点击某个按钮,触发了toast以后,toast内容会一直排着队的显示出来,不能很快的
- 概述LruCache的核心原理就是对LinkedHashMap的有效利用,它的内部存在一个LinkedHashMap成员变量,值得注意的4个
- 去公司面试,对方一口一个controller,一口一个service,dao,搞得我很紧张。其实都是很简单的东西,只是自己当时不知道罢了,接
- 不想废话,直接写了!因为是留给自己做随笔的,所以大神们看到别喷…… 1.必须有微信公众账号 2.你也可以申请测试微信号,
- 因为我本人很喜欢在不同的页面之间跳转时加点好玩的动画,今天无意间看到一个动画效果感觉不错,几种效果图如下:既然好玩就写在博客中,直接说就是:
- 一、什么是内存泄漏内存泄漏是指你向系统申请分配内存进行使用(new/malloc),然后系统在堆内存中给这个对象申请一块内存空间,但当我们使
- 一、Java并发是什么?用学术定义来说就是并发:同一时间段,多个任务都在执行 (单位时间内不一定同时执行);简单来说就是,同一个时间段,让计
- 故事背景故事发生在几个星期前,自动化平台代码开放给整个测试团队以后,越来越多的同事开始探索平台代码。为了保障自动化测试相关的数据和沉淀能不被
- 今天要介绍一个概念,对象的克隆。本篇有一定难度,请先做好心理准备。看不懂的话可以多看两遍,还是不懂的话,可以在下方留言,我会看情况进行修改和
- 比如在窗体中显示时间:错误思路一:我在窗体结构函数中写入一个死循环,每隔一秒显示一次当前时间public Form6() &n
- JavaScript 中需要创建函数的话,有两种方法:函数声明、函数表达式,各自写法如下:// 方法一:函数声明function foo()
- 在android 中可以广泛看到的template<typename T> class Sp 句柄类实际上是android 为实
- 本文实例讲述了Android编程之OpenGL绘图技巧。分享给大家供大家参考,具体如下:很久不用OpenGL ES绘图,怕自己忘记了,于是重
- 最近 Google 已经发布 Android 新版本 7.0 Nougat (牛轧糖) ,相信Android手机用户在未来的几个月内会收到第
- foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。foreach元素的属性主要有item,index,colle
- Java提供一种机制叫做序列化,通过有序的格式或者字节序列持久化java对象,其中包含对象的数据,还有对象的类型,和保存在对象中
- 在上一篇实现了简单的画板功能, 这篇实现橡皮擦功能,首先分析一下应该如何实现,在Andriod有个图像混合(Xfermode)概念,利用这个
- http interface从 Spring 6 和 Spring Boot 3 开始,Spring 框架支持将远程 HTTP 服务代理成带
- 目录一、所使用的环境配置:二、项目简介三、知识点总结(代码和配置)SpringBoot:1.Mybatis-Plus配置文件,实现分页查询:
- 走马灯是一种常见的效果,本文讲一下如何用 PageView 在 Flutter 里实现一个走马灯, 效果如下,当前页面的高度比其它页面高,切