Unity 中实现可翻页的 PageView

news2025/6/6 19:13:29

之前已经实现过:

Unity 中实现可复用的 ListView-CSDN博客文章浏览阅读5.6k次,点赞2次,收藏27次。源码已放入我的 github,地址:Unity-ListView前言实现一个列表组件,表现方面最核心的部分就是重写布局(Layout)。对于简单的列表,尤其是“Cell数量固定且较少、没有超页滚动展示”一类的需求,使用UGUI自带的布局组件进行布局即可。分别为:水平布局组件(Horizontal Layout Group)、竖直布局组件(Vertical Layout Gro..._unity listview https://blog.csdn.net/NRatel/article/details/100561203Unity 中实现可复用的 GridView-CSDN博客文章浏览阅读4k次。本文介绍了如何基于Unity的UGUI系统设计一个灵活的GridView组件。作者分析了GridLayoutGroup的参数,讨论了StartCorner和StartAxis的排布方式、Constraint的灵活性以及Padding与对齐方式的巧妙结合。在实现过程中,修改了ScrollRect的关联ScrollBar和布局接口,设计了适应不同滑动方向的布局,并实现了元素复用逻辑,包括四种滑动方向的计算。此外,还探讨了Content锚点、行列约束和对齐方式的调整,以提高组件的易用性。 https://blog.csdn.net/NRatel/article/details/124063559Unity 中实现首尾无限循环的 ListView-CSDN博客文章浏览阅读1.3k次,点赞21次,收藏23次。以 ListView 为基础。参照 GrideView 修改 ListView:使其 继承 UIScrollRect(原因是必须修改部分源码)并支持参数:MovementAxis、StartSide、ChildAligment实现几个要点...... https://blog.csdn.net/NRatel/article/details/148335474可翻页的 PageView,还是以 ListView 为基础(支持已实现的ListView的全部功能)。

支持要点:

(以下仅以 MovementAxis=Horizontal,StartSide=Left 的情形阐述)

1、自动吸附对齐(Snap)

    滑动放手后(若开启惯性滑动,则为停稳后),要自动将Cell吸附对齐到Viewport中心,没有自动吸附对齐,就不能产生Page的概念。

    将吸附到哪一页,由“放手/停稳时位置” 决定, 接近哪一页就吸附到哪一页。

    可配置:
        ①、是否启用(目前强制启用,否则将退化为 UIListView)
        ②、吸附/对齐速度(每帧移动的像素数)
        ③、开启惯性时,等待基本停稳才开始Snap,停稳阈值

2、翻页类型(CellOccupyPage)

    是否勾选,决定两种展现形式:
        ①、保持List形式;
        ②、Cell 在滑动方向上独占一页(调整Spacing)

3、是否自动轮播(Carousel)

    可配置:
        ①、是否启用
        ②、轮播翻页速度每帧移动的像素数)
        ③、翻页间隔/页停留时间
        ④、是否反向轮播

实现要点:

1、paddingLeft、paddingRight。

    需强设:paddingLeft = paddingRight = (Viewport宽度 - Cell宽度)/2。

    因为要保证第一个和最后一个Cell能够处于Viewport的中心。

    这个计算方式对 “Cell宽度 <= Viewport宽度” 和 “Cell宽度 > Viewport宽度”的情况都是适用的。

//调整边距(注意只调整滑动方向)
protected override void FixPadding()
{
    if (m_Loop)
    {
        base.FixPadding();
    }
    else
    {
        if (m_MovementAxis == MovementAxis.Horizontal)
        {
            int fixedPaddingX = Mathf.FloorToInt((m_Viewport.rect.width - m_CellRect.width) / 2);
            padding.left = padding.right = fixedPaddingX;
        }
        else
        {
            int fixedPaddingY = Mathf.FloorToInt((m_Viewport.rect.height - m_CellRect.height) / 2);
            padding.top = padding.bottom = fixedPaddingY;
        }
    }
}

2、spacingX

    若勾选 CellOccupyPage,需强设:spacingX = Viewport宽度 - Cell宽度;

//调整间距(注意只调整滑动方向)
protected override void FixSpacing()
{
    if (!m_CellOccupyPage) { return; }
    if (m_MovementAxis == MovementAxis.Horizontal)
    {
        float fixedSpacingX = m_Viewport.rect.width - m_CellRect.width;
        spacing = new Vector2(fixedSpacingX, spacing.y);
    }
    else
    {
        float fixedSpacingY = m_Viewport.rect.height - m_CellRect.height;
        spacing = new Vector2(spacing.x, fixedSpacingY);
    }
}

3、Snap 实现:

    ①、找离Viewport中心最近的那个Cell
        遍历正在显示的Cell(一般数量较少,无需担心性能),分别计算每个Cell离Viewport中心的距离,找出最近的那个

    ②、与回弹的冲突
        若开启边界回弹,则需等待回弹结束,再开始 Snap
        有阈值,但不支持外部自定义(应固定实现好)

    ③、与惯性速度的冲突
        若开启惯性速度,则需等待停稳,再开始 Snap
        有阈值,支持外部自定义(影响节奏)

4、Carousel 实现:

    ①、在协程中等待计时
    ②、若当前处于非最后一页,则翻到下一页;若当前处于最后一页,则迅速反向翻回到第一页 
    ③、支持反向轮播

5、StartShow、BeginDrag、EndDrag、Snap、Carousel 的闭环衔接(核心流程)

    StartShow 时: TryStartSnap
    BeginDrag 时: TryStopSnap、TryStopCarousel
    EndDrag 时: TryStartSnap
    Snap 结束时: TryStartCarousel
    Carousel 结束时: TryStartSnap

6、loop (首尾无限循环)对 PageView 的影响

    ①、首尾无限循环没有“边界”,自然就没有“边距”可言。但实际上,它还影响首页初始位置。因此此时无需修改 padding,而是保持用户指定值
    ②、开启循环时, 总是向后翻到下一页,无需在最后一页时,迅速翻回首页

    ③、因为 loop 会重置 Content 的位置,所以 Snap 和 Carousel 时的移动插值不能是 “从当前位置到目标点”了,而是要变成“累计移动量”
        

----------------------------------------- NRatel割 -----------------------------------------

实现效果:

启用 CellOccupyPage

源码:GitHub - NRatel/Unity-ListView基于UnityUGUI,实现标准的可复用Cell的列表视图。包括一些特殊需求,持续整合中。。. Contribute to NRatel/Unity-ListView development by creating an account on GitHub.https://github.com/NRatel/Unity-ListView

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2402012.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

云计算 Linux Rocky day05【rpm、yum、history、date、du、zip、ln】

云计算 Linux Rocky day05【rpm、yum、history、date、du、zip、ln】 目录 云计算 Linux Rocky day05【rpm、yum、history、date、du、zip、ln】1.RPM包的一般安装位置2.软件名和软件包名3.查询软件信息4.查询软件包5.导入红帽签名信息&#xff0c;解决查询软件包信息报错6.利用…

LuaJIT2.1 和 Lua5.4.8 性能对比

说明 最近在学习 LuaJIT&#xff0c;想看看把它接入到项目中使用&#xff0c;会提高多大的性能。 今天抽时间&#xff0c;简单地测试了一下 LuaJIT 2.2 和 Lua5.4.8 的性能。 测试平台&#xff1a; 系统&#xff1a;Windows 10 WSLCPU&#xff1a;Intel Core™ i7-8700 CPU…

深入解析与解决方案:处理Elasticsearch中all found copies are either stale or corrupt未分配分片问题

目录 引言 1 问题诊断深入分析 1.1 错误含义深度解析 1.2 获取详细的诊断信息 2 解决方案选择与决策流程 2.1 可用选项全面对比 2.2 推荐处理流程与决策树 3 具体操作步骤详解 3.1 优先尝试 - 分配最新副本&#xff08;最低风险&#xff09; 3.2 中等风险方案 - 分配…

【NLP 78、手搓Transformer模型结构】

你以为走不出的淤泥&#xff0c;也迟早会云淡风轻 —— 25.5.31 引言 ——《Attention is all you need》 《Attention is all you need》这篇论文可以说是自然语言处理领域的一座里程碑&#xff0c;它提出的 Transformer 结构带来了一场技术革命。 研究背景与目标 在 Transfo…

如何自定义WordPress主题(5个分步教程)

如果您已经安装了一个 WordPress 主题&#xff0c;但它不太适合您&#xff0c;您可能会感到沮丧。在定制 WordPress 主题方面&#xff0c;您有很多选择。 挑战在于找到正确的方法。 在本篇文章中&#xff0c;我将引导您了解自定义 WordPress 主题的各种选项&#xff0c;帮助您…

react实现markdown文件预览

文章目录 react实现markdown文件预览1、实现md文件预览2、解决图片不显示3、实现效果 react实现markdown文件预览 1、实现md文件预览 1️⃣第一步&#xff1a;安装依赖&#xff1a; npm install react-markdown remark-gfmreact-markdown&#xff1a;将 Markdown 渲染为 Rea…

PDF处理控件Aspose.PDF教程:在 C# 中更改 PDF 页面大小

PDF 的页面大小决定了其内容的显示、打印或处理方式。我们通常在准备打印、转换格式或标准化布局时需要更改 PDF 页面大小。在本文中&#xff0c;您将学习如何使用 C# 更改任何 PDF 文件的页面大小。我们将通过完整的代码示例&#xff0c;逐步指导您完成操作。 Aspose.PDF最新…

rust或tauri项目执行命令的时候,cmd窗口也会弹出显示解决方法

阻止 Tauri 执行命令时弹出 CMD 窗口 当你在 Tauri 中使用 tokio::process::Command 执行命令时弹出 CMD 窗口&#xff0c;这是因为 Windows 默认会为控制台程序创建可见窗口。以下是几种解决方法&#xff1a; 1. 使用 Windows 特有的创建标志 (推荐) #[tauri::command] pub…

使用Python进行函数作画

前言 因为之前通过deepseek绘制一下卡通的人物根本就不像&#xff0c;又想起来之前又大佬通过函数绘制了一些图像&#xff0c;想着能不能用Python来实现&#xff0c;结果发现可以&#xff0c;不过一些细节还是需要自己调整&#xff0c;deepseek整体的框架是没有问题&#xff0…

微型导轨在手术机器人领域中有哪些关键操作?

在微创手术领域&#xff0c;手术机器人凭借其高精度、高稳定性和远程操控能力&#xff0c;正逐步成为现代外科手术的重要工具。微型导轨作为一种专为高精度运动设计的线性导向系统&#xff0c;凭借其亚微米级定位精度、低摩擦运动特性及紧凑结构设计&#xff0c;已成为手术机器…

FPGA 的硬件结构

FPGA 的基本结构分为5 部分&#xff1a;可编程逻辑块&#xff08;CLB&#xff09;、输入/输出块&#xff08;IOB&#xff09;、逻辑块之间的布线资源、内嵌RAM 和内嵌的功能单元。 &#xff08;1&#xff09;可编程逻辑块&#xff08;CLB&#xff09; 一个基本的可编程逻辑块由…

EasyRTC音视频实时通话助力新一代WebP2P视频物联网应用解决方案

一、方案背景​ 物联网技术深刻变革各行业&#xff0c;视频物联在智慧城市、工业监控等场景广泛应用。传统方案依赖中心服务器中转&#xff0c;存在传输效率低、网络负载大的问题。新一代WebP2P视频物联技术实现设备直连&#xff0c;降低网络压力并提升传输效率&#xff0c;成…

QT开发技术【ffmpeg + QAudioOutput】音乐播放器 完善

一、完善上章的功能&#xff0c;形成一个小工具 QT开发技术【ffmpeg QAudioOutput】音乐播放器 二、增加歌曲保存类 #include "../Include/MusicListManager.h" #include "QtGui/Include/Conversion.h" #include <QFile> #include <QXmlStream…

vscode 离线安装第三方库跳转库

我安装的是C/C的函数跳转 下载的离线库&#xff1a; 项目首页 - vscode代码自动补全跳转插件离线安装包:cpptools-win32.vsix是一款专为VSCode设计的离线安装插件&#xff0c;特别适合无法连接网络的电脑环境。通过安装此插件&#xff0c;您的VSCode将获得强大的代码自动跳转…

DevExpress WinForms v24.2 - 新增日程组件、电子表格组件功能扩展

DevExpress WinForms拥有180组件和UI库&#xff0c;能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序&#xff0c;无论是Office风格的界面&#xff0c;还是分析处理大批量的业务数据&#xff0c;它都能轻松胜…

基于机器学习的心脏病预测模型构建与可解释性分析

一、引言 心脏病是威胁人类健康的重要疾病之一&#xff0c;早期预测和诊断对防治心脏病具有重要意义。本文利用公开的心脏病数据集&#xff0c;通过机器学习算法构建预测模型&#xff0c;并使用 SHAP 值进行模型可解释性分析&#xff0c;旨在为心脏病的辅助诊断提供参考。 二、…

谷粒商城-分布式微服务项目-高级篇[三]

十五、商城业务-支付 15.1 支付宝支付 15.1.1 进入“蚂蚁金服开放平台” 支付宝开放 平台地址&#xff1a; 支付宝开放平台 15.1.2 下载支付宝官方 demo&#xff0c;进行配置和测试 开发者文档&#xff1a;支付宝开放平台文档中心 电脑网站支付文档&#xff1a;小程序文…

实现购物车微信小程序

实现一个微信小程序购物车页面&#xff0c;包含以下功能&#xff1a; 需求说明&#xff1a; 商品列表&#xff1a;显示商品名称、价格、数量加减按钮&#xff0c;支持修改商品数量&#xff08;数量≥1&#xff09;。 全选 / 反选功能&#xff1a;顶部 “全选” 复选框&#…

26考研 | 王道 | 计算机组成原理 | 四、指令系统

26考研 | 王道 | 计算机组成原理 | 四、指令系统 文章目录 26考研 | 王道 | 计算机组成原理 | 四、指令系统1.指令系统0.指令集体系结构1. 指令格式1.按地址码数目不同来分2.指令-按指令长度分类3.指令-按操作码长度分类4.指令-按操作类型分类 2. 扩展操作码指令格式 2.指令的寻…

在 Windows 系统安装 Git

前往官网下载Git - Downloads 目录 一、下载安装包 二、安装 Git 三、安装完成 四、验证安装 五、问题解决 解决步骤 一、下载安装包 点击页面右侧 “Download for Windows” 按钮。 点击页面最上方 “Click here to download” &#xff0c;下载 Git for Windows/x64 …