当前位置: 首页 > news >正文

Unity引擎UI滚动列表——滚动复用扩展应用

  大家好,我是阿赵。
  之前介绍了滚动复用的基础用法。上一个例子里面,是一个竖向单列的滚动列表展示。这一次来扩展一下用法。如果不知道上一次例子的,可以先往前翻一下,上面有例子的详情、原理解释和代码。

一、 多列的滚动复用

  有时候,需要展示的东西很多,需要同时显示多列。比如背包,很多个格子在一行。
  其实在昨天的基础上,稍微改一下,就能实现多列的显示。

Unity引擎UI滚动复用3

  整体思路还是和单列的例子一样,算出每一个index对应的item所在的位置,然后判断是否在当前显示区域内,然后刷新就行了。
  上次计算单列的时候,计算item位置是只算了Y坐标的,而且每个高度是通过item的高度加上space的间距来计算的:

protected virtual void InitData()
{int count = dataList.Count;for (int i = 0; i < count; i++){float startPos = i * itemHeight;if(i>0){startPos += spacing * i;}itemPosList.Add(new Vector4(0, startPos,0,startPos+itemHeight));}contentHeight = itemHeight*count;if(count>1){contentHeight += spacing * (count - 1);}content.sizeDelta = new Vector2(viewWidth, contentHeight);
}

  但如果不是单列的情况,那么我们也不能单纯的计算Y坐标了,要把X坐标也计算进去。
  假设我现在需要每行显示的item数量,是根据显示范围自动适配的,方法并不复杂,只需要做一个循环,然后不停的模拟把item放进去,然后判断一下,每一行放了新的item之后,会不会超过显示范围的宽度。如果超过了宽度,就把这个item放到下一行的开头。
  修改之后的InitData方法会变成这样:

protected override void InitData()
{int count = dataList.Count;for (int i = 0; i < count; i++){float startPos = i * itemHeight;if(i>0){startPos += spacing * i;}itemPosList.Add(new Vector4(0, startPos,0,startPos+itemHeight));}contentHeight = itemHeight*count;if(count>1){contentHeight += spacing * (count - 1);}content.sizeDelta = new Vector2(viewWidth, contentHeight);
}

  由于一个item的宽度是200,然后间距是5,所以当显示范围的宽度是610的时候,刚刚好可以一行显示3个item:
在这里插入图片描述

  如果把显示范围缩小一点,比如改为550,一行已经放不下3个了,那么就会自动换行,变成了一行显示2个。
在这里插入图片描述

  由于这个计算只在初始化的时候算一次而已,所以并不会很复杂。这样做就可以做到自适应背景宽度来显示每行的item数。
  如果需求不是自动适应,而是要需要指定每行显示的数量,那就不需要那么麻烦了,直接算每个index对应的行列数,就能得出每个item应该所在的位置了。

二、 大小不定的滚动复用

  之前的例子都是固定同样大小的item来显示滚动列表。不过有很多时候,可能会需要用到不一样大小的item混合在同一个滚动列表里面显示,比如这个例子:

Unity引擎UI滚动复用5

在这里插入图片描述

  每隔多少个item,就会显示一个长条形的item。或者一列里面,会出现不同高度的item。
  这个实现的思路其实也是很简单的。回到上面第一个例子,用自动适配的方式,根据显示范围的宽度来决定一行里面需要显示多少个item,然后每一行的高度,是这一行里面所有item中的高度最大值。
所以这时候,item的宽高就不是固定的值了,需要有一个地方可以查找到。比如通过传入的数据里面定义一个类型,然后找到对应的item宽高。
  由于我这个只是测试的例子,并没有实际的数据输入的,所以我就取巧一下,设置一个间隔数量spaceItemCount,然后设置2种item的大小,每隔spaceItemCount个item就用一个第二种的item宽高来模拟。
  于是,InitData方法会变成这样:

protected override void InitData()
{int count = dataList.Count;contentHeight = 0;float curWidth = 0;float tempItemWidth = 0;float tempItemHeight = 0;float nextItemWidth = 0;float nextItemHeight = 0;float maxHeight = 0;int lastItemType = 1;for (int i = 0; i < count; i++){tempItemWidth = itemWidth;tempItemHeight = itemHeight;if(i%spaceItemCount==0){tempItemWidth = itemWidth2;tempItemHeight = itemHeight2;lastItemType = 2;}else{lastItemType = 1;}if(tempItemHeight>maxHeight){maxHeight = tempItemHeight;}itemPosList.Add(new Vector4(curWidth, contentHeight, curWidth + tempItemWidth, contentHeight + tempItemHeight));if(i+1%spaceItemCount==0){nextItemWidth = itemWidth2;nextItemHeight = itemHeight2;}else{nextItemWidth = itemWidth;nextItemHeight = itemHeight;}if (curWidth+ tempItemWidth + spacing + nextItemWidth > viewWidth){contentHeight += spacing + maxHeight;curWidth = 0;maxHeight = 0;}else{curWidth += spacing + tempItemWidth;}}if(curWidth>0){if(lastItemType == 1){contentHeight += itemHeight;}else{contentHeight += itemHeight2;}}content.sizeDelta = new Vector2(viewWidth, contentHeight);
}

  由于是适配显示范围的宽度,我这个例子是经过设计,第二种item的宽度是刚好和现实范围一样的。假如宽度是随意的,就会变成这样的效果:

Unity引擎UI滚动复用4

  可以看到,最终的效果,还是以一行能放多少个item不会超过显示范围高度为标准,然后每一行的高度,是以那一行高度最大的item为标准。
在这里插入图片描述

相关文章:

Unity引擎UI滚动列表——滚动复用扩展应用

大家好&#xff0c;我是阿赵。   之前介绍了滚动复用的基础用法。上一个例子里面&#xff0c;是一个竖向单列的滚动列表展示。这一次来扩展一下用法。如果不知道上一次例子的&#xff0c;可以先往前翻一下&#xff0c;上面有例子的详情、原理解释和代码。 一、 多列的滚动复…...

MySQL 死锁排查

私人博客传送门 MySQL 死锁排查...

AI - 浅聊一下基于LangChain的AI Agent

AI - 浅聊一下基于LangChain的AI Agent 大家好&#xff0c;今天我们来聊聊一个很有意思的主题&#xff1a; AI Agent &#xff0c;就是目前非常流行的所谓的AI智能体。AI的发展日新月异&#xff0c;都2024年末了&#xff0c;如果此时小伙伴们对这个非常火的概念还不清楚的话&a…...

校园综合服务小程序+ssm

摘 要 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;校园综合服务被用户普遍使用&#xff0c;为方便用户能够可…...

RPC设计--TcpConnection和TcpServer

TcpConnection 对于服务端来说用来封装clientfd&#xff0c;对于client端来说&#xff0c;就是封装connect函数返回后的fd. 处理此fd上的读写&#xff0c;因此需要为其提供read\write方法&#xff0c;其方法内部调用系统的read\write函数&#xff0c;从fd中读写数据。 当Fd上…...

Mysql 的 B+ 树是否包含行数据?

在 MySQL 中&#xff0c;是否在 B树 的叶子节点上存储完整的行数据&#xff0c;取决于使用的 存储引擎 和 索引类型&#xff1a; 聚簇索引 (Clustered Index) 叶子节点包含完整的行数据。 适用场景&#xff1a;MySQL InnoDB 存储引擎的主键索引&#xff08;或聚簇索引&#xf…...

CSS系列(2)-- 盒模型精解

前端技术探索系列&#xff1a;CSS 盒模型精解 &#x1f4e6; 致读者&#xff1a;深入理解盒模型的本质 &#x1f44b; 前端开发者们&#xff0c; 今天我们将深入探讨 CSS 盒模型&#xff0c;这是构建网页布局的核心概念。通过本文&#xff0c;你将全面理解盒模型的工作原理及…...

Matlab在信号处理领域有哪些典型的设计实例?

以下是Matlab在信号处理领域的一些典型设计实例&#xff1a; 一、信号生成与频谱分析 正弦信号生成与频谱分析 - 题目&#xff1a;生成一个频率为 f 10 H z f 10Hz f10Hz&#xff0c;采样频率为 f s 100 H z f_s100Hz fs​100Hz&#xff0c;时长为 T 5 s T 5s T5s的正弦…...

frida(objection)中x.ts到x.py封装路径

objection run "android hooking list classes" 基于sensepost/objection.git/1.11.0 sensepost/objection.git/e7eb1 简版路径: android hooking list classes --> show_android_classes --> android_hooking_get_classes androidHookingGetClasses --&g…...

python学习笔记—1—基础环境配置和字面量

1. 字面量 在代码中被写下来的固定值称为字面量 &#xff08;1&#xff09;整数字面量 666 &#xff08;2&#xff09;浮点字面量 6.66 &#xff08;3&#xff09;字符串字面量 "supercarrydoinb" 2. python中的数据类型 3. 打印字面量 print("666") …...

【Windows11系统局域网共享文件数据】

【Windows11系统局域网共享文件数据】 1. 引言1. 规划网络2. 获取必要的硬件3. 设置网络4. 配置网络设备5. 测试网络连接6. 安全性和维护7. 扩展和优化 2. 准备工作2.1: 启用网络发现和文件共享2.2: 设置共享文件夹 3. 访问共享文件夹4. 小贴士5. 总结 1. 引言 随着家庭和小型办…...

包管理器npm, cnpm, yarn 和 pnpm 的命令

npm (Node Package Manager) 安装与更新 npm install 或 npm i&#xff1a; 安装项目依赖&#xff1a;根据 package.json 文件安装所有列出的依赖。参数&#xff1a; -S, --save&#xff1a;保存到 dependencies&#xff08;默认行为&#xff09;。-D, --save-dev&#xff1a;…...

MATLAB 最小二乘平面拟合(90)

MATLAB 最小二乘平面拟合(90) 一、算法介绍二、算法实现1.代码2.结果:一、算法介绍 平面方程: ax+by+cz+d = 0 执行任务:读取一组点云(这里用自定义生成的平面模拟点云代替,在其中添加了噪声来模拟真实的数据),使用最小二乘拟合平面,来输出平面参数,并可视化显示拟…...

kubesphere服务报错 页面无法登陆

kubesphere的页面无法访问 查看pod服务&#xff0c;发现ks-apiserver的pod一直在重启 在所在node节点&#xff0c;执行dmesg -T 发现内存溢出 修改deploy的memory的配置 原本的request memory的值为100M 调整为2G 修改之后&#xff0c;服务正常启动&#xff0c;页面访问正常…...

filezilla连接不上虚拟机的解决方案

现象 解决过程 虚拟机终端输入ip addr 输出&#xff1a; 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever p…...

番茄钟与Todo List:用Go构建高效的时间管理工具

引言 在当今快节奏的世界中&#xff0c;时间管理和任务组织变得越来越重要。为了帮助用户提高效率&#xff0c;我开发了一个基于Golang的开源项目&#xff0c;基于fyne的ui&#xff0c;它结合了经典的番茄工作法&#xff08;Pomodoro Technique&#xff09;和功能丰富的待办事…...

vim实用命令整理(常用的命令)

本章教程,总结自己平时使用vim过程中,经常使用的命令,分享给大家。 一、高频使用 i:进入插入模式(光标处插入) a:进入插入模式(光标后插入) esc:返回普通模式 ::进入命令模式 :w:保存 :q:退出 :wq:保存并退出 :q!:强制退出不保存 :e filename:打开文件 :set n…...

METAGPT

METAGPT: META PROGRAMMING FOR A MULTI-AGENT COLLABORATIVE FRAMEWORK MetaGPT&#xff1a;面向多代理协作框架的元编程 1. 引言 近年来&#xff0c;基于大型语言模型&#xff08;LLMs&#xff09;的多智能体系统在自动问题解决方面取得了显著进展。然而&#xff0c;现有的…...

LabVIEW调用Thorlabs的动态库进行开发

Thorlabs 产品在科研与生产领域中的应用广泛&#xff0c;当需要基于LabVIEW 进行二次开发时&#xff0c;可按照以下方法操作&#xff0c;以充分发挥设备性能并满足特定的项目需求。 创建 Kinesis LabVIEW 项目文件和文件夹 更详细的说明参见附件 在 LabVIEW 的启动界面中选择…...

Lua使用点号和冒号的区别

首先建立一个table&#xff0c;再分别定义两个方法&#xff0c;如下&#xff1a; local meta {}function meta:test1(...)print(self)print("")for k,v in pairs({...}) doprint(v)end endfunction meta.test2(...)print(self)print("")for k,v in pairs…...

Rust学习笔记_13——枚举

Rust学习笔记_10——守卫 Rust学习笔记_11——函数 Rust学习笔记_12——闭包 枚举 文章目录 枚举1. 定义1.1 无值变体1.2 有值变体1.3 枚举与泛型的结合 2. 使用2.1 和匹配模式一起使用2.2 枚举作为类型别名 3. 常用枚举类型 在Rust编程语言中&#xff0c;枚举&#xff08;enum…...

集合框架(1)

集合框架&#xff08;1&#xff09; 1、数组的特点与弊端 &#xff08;1&#xff09;特点&#xff1a; 数组初始化以后&#xff0c;长度就确定了。数组中的添加的元素是依次紧密排列的&#xff0c;有序的&#xff0c;可以重复的。数组声明的类型&#xff0c;就决定了进行元素初…...

【Docker系列】Docker 构建多平台镜像:arm64 架构的实践

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

软件工程 概述

软件 不仅仅是一个程序代码。程序是一个可执行的代码&#xff0c;它提供了一些计算的目的。 软件被认为是集合可执行的程序代码&#xff0c;相关库和文档的软件。当满足一个特定的要求&#xff0c;就被称为软件产品。 工程 是所有有关开发的产品&#xff0c;使用良好定义的&…...

汽车产业数字化转型:协同创新破解挑战,平衡安全与流通

在数字经济时代的浪潮中&#xff0c;数据资源和数据信息已成为驱动各行各业转型升级的“新石油”。汽车产业&#xff0c;作为国民经济的重要支柱&#xff0c;正经历着前所未有的变革。随着数字化创新和转型的深入&#xff0c;数据在汽车全产业链中的作用和价值日益凸显。在这个…...

Oracle EBS PAC 如何复修非标任务单生产生非常大的PAC成本?

系统环境 RDBMS : 12.1.0.2.0 Oracle Applications : 12.2.6 问题症状 非标准任务单组件和装配相同物料A,俗称投入A产A。该物料A的期初数量为0。 上期成本假设为20,而本期成本爆增至563.674234。关键问题点: 由于该物料没有期初数量,无法通过“更新定期成本”指定“新期本…...

Docker 学习总结(84)—— Docker 常用运维命令

版本与信息查询 docker --version:查看安装的Docker版本。 docker info:获取Docker系统的详细配置信息。 镜像管理 docker images:列出本地所有镜像。 docker search IMAGE_NAME:搜索Docker Hub上的镜像。 docker pull IMAGE_NAME[:TAG]:从仓库下载指定镜像。 docker rmi …...

【MySQL】存储过程和触发器

MySQL存储过程和触发器 一、存储过程的介绍二、存储过程的相关操作2.1创建存储过程2.2查看存储过程2.4调用存储过程2.5删除存储过程 三、变量3.1系统变量3.2用户定义变量3.3局部变量 四、存储过程中的关键字4.1 if4.2参数4.3case4.4 while4.5repeat4.6 loop4.7游标4.8条件处理程…...

透彻理解并解决Mockito模拟框架的单元测试无法运行的问题

本篇的实例基于Maven IDE (VS Code) 运行 在VS Code 运行的时候&#xff0c; 不需要在pom.xml 中添加任何插件就可以在测试类中看到如下的绿色按钮&#xff0c;单击就可以运行使用Mockito 注解 ExtendWith(MockitoExtension.class) 或是 Mockito 代码方式的测试。 不使用注…...

《掌握Nmap:全面解析网络扫描与安全检测的终极指南》

 nmap # 简介&#xff08;帮助&#xff09; 用法&#xff1a;nmap [扫描类型] [选项] {目标指定内容} 简介&#xff08;帮助&#xff09; 用法&#xff1a;nmap [扫描类型] [选项] {目标指定内容} 一、目标指定&#xff1a; 可以传入主机名、IP 地址、网络等。 例如&a…...

Thonny IDE + MicroPython + ESP32 + LU-ASR01语音识别

LU-ASR01是一款采用深度学习算法的离线语音识别开发板&#xff0c;无需联网即可独立运行。它具备自动识别中文语音输入并进行相应处理的能力。此开发板拥有1路输出的串口TX。该开发板需在天问Block IDE&#xff08;http://twen51.com/new/twen51/index.php&#xff09;中开发&a…...

关闭模组的IP过滤功能

关闭模组的IP过滤功能 关闭模组的IP过滤功能 本脚本用于关闭模组的IP过滤功能&#xff0c;关闭后&#xff0c; 源地址不是终端IP的数据包&#xff0c;也可以被模组转发给网络 关闭模组的IP过滤功能 cat > /usr/bin/ipfilter << "EOF"echo -e "ATCFUN…...

免费下载 | 2024数据资源入表年度发展报告

《2024数据资源入表年度发展报告》的核心内容包括以下几个方面&#xff1a; 总体发展概述&#xff1a; 数据被正式列入五大生产要素之一&#xff0c;标志着中国进入数据要素红利释放阶段。 “数据入表”是指将企业数据资源按会计准则确认、计量&#xff0c;并在财务报表中反映…...

【全网最新】使用 1panel面板 部署若依系统( springboot 和 vue)项目

​​​​​​使用 1panel面板 部署 springboot 和 vue_1panel部署vue项目-CSDN博客 准备工作: 准备好的网站后台代码文件准备好的网站前端页面安装好1panel1panel中安装好mysql1panel中安装好redis1panel中安装好Openresty部署后台接口 在application.yml中修改后台端口,这里…...

基于遗传优化算法的带时间窗多车辆路线规划matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于遗传优化算法的带时间窗多车辆路线规划matlab仿真&#xff0c;通过输入各个节点坐标&#xff0c;以及出发点到节点的时间窗&#xff0c;来进行优化&#xff0…...

MCU、ARM体系结构,单片机基础,单片机操作

计算机基础 计算机的组成 输入设备、输出设备、存储器、运算器、控制器 输入设备&#xff1a;将其他信号转换为计算机可以识别的信号&#xff08;电信号&#xff09;。输出设备&#xff1a;将电信号&#xff08;&#xff10;、&#xff11;&#xff09;转为人或其他设备能理解的…...

黑马点评项目测试总结

黑马点评项目测试面经总结&#xff1a; 一&#xff0c;怎么使用使用Postman进行接口测试&#xff1f; 1&#xff0c;安装Postman 2. 创建请求&#xff1a; 打开Postman&#xff0c;点击"New"按钮创建一个新的请求。在弹出的窗口中&#xff0c;选择请求的类型&#x…...

YOLOv8-ultralytics-8.2.103部分代码阅读笔记-loaders.py

loaders.py ultralytics\data\loaders.py 目录 loaders.py 1.所需的库和模块 2.class SourceTypes: 3.class LoadStreams: 4.class LoadScreenshots: 5.class LoadImagesAndVideos: 6.class LoadPilAndNumpy: 7.class LoadTensor: 8.def autocast_list(source…...

Ubuntu Linux 图形界面工具管理磁盘分区和文件系统(八)

本文为Ubuntu Linux操作系统- 第八弹~~ 今天接着上文的内容&#xff0c;讲Linux磁盘分区存储的相关知识~ 上期回顾&#xff1a;命令行-管理磁盘分区和文件系统 今天看酷酷的雪獒铠甲&#xff01;&#xff01;雪獒铠甲合体~ 文章目录 磁盘管理器GNOME Disks主要功能安装命令 磁盘…...

Windows系统修改文件的默认打开方式的3种方式

文章目录 1.右键打开方式2.属性3.设置-按文件类型打开 1.右键打开方式 2.属性 3.设置-按文件类型打开 word文档 excel表格...

2023 年“泰迪杯”数据分析技能赛B 题企业财务数据分析与造假识别

2023 年“泰迪杯”数据分析技能赛B 题企业财务数据分析与造假识别 一、背景 财务数据是指企业经营活动和财务结果的数据记录&#xff0c;反映了企业的财务状况 与经营成果。对行业、企业的财务数据进行分析&#xff0c;就是要评价其过去的经营业绩、 衡量现在的财务状况、预测…...

数据分析系列---requests的使用

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 主环境和虚拟环境 主环境是电脑上安装的python环境 虚拟环境在项目中可以实现环境的隔离&#xff0c;假设DemoA和DemoB分别用到了某个三方库1.0和2.0版本&#xff0c;那么在一个…...

sql删除冗余数据

工作或面试中经常能遇见一种场景题&#xff1a;删除冗余的数据&#xff0c;以下是举例介绍相应的解决办法。 举例&#xff1a; 表结构&#xff1a; 解法1&#xff1a;子查询 获取相同数据中id更小的数据项&#xff0c;再将id不属于其中的数据删除。-- 注意&#xff1a;mysql中…...

ElementUI 问题清单

1、form 下面只有一个 input 时回车键刷新页面 原因是触发了表单默认的提交行为&#xff0c;给el-form 加上submit.native.prevent就行了。 <el-form inline submit.native.prevent><el-form-item label"订单号"><el-inputv-model"query.order…...

uniapp 微信小程序webview 和 h5数据通信

项目是uniapp编写&#xff0c;因为是先开发了h5和app&#xff0c;小程序是突然要用的&#xff0c;做兼容开发已经来不及&#xff0c;由于微信小程序webview载入h5 因为通信必须要特殊限制&#xff08;网页向小程序 postMessage 时&#xff0c;会在以下特定时机触发并收到消息&a…...

3D 生成重建021-LRM基于大模型的生成式3D生成模型

3D 生成重建021-LRM基于大模型的生成式3D生成模型 文章目录 0 论文工作1 论文方法2 实验结果 0 论文工作 论文提出了一种名为大型重建模型 (LRM) 的新型模型&#xff0c;该模型可在短短 5 秒内根据单张输入图像预测物体的 3D 模型。与许多先前仅在 ShapeNet 等小型数据集上进行…...

12.6深度学习_模型优化和迁移_整体流程梳理

七、整体流程梳理 1. 引入使用的包 用到什么包&#xff0c;临时引入就可以&#xff0c;不用太担心。 import time import osimport numpy as np import pandas as pd import torch import torch.nn as nn import torch.optim as optim import torchvision import torchvisio…...

CCF-GESP 编程能力认证 C++ 七级 2024年9月份判断题详细解析

链接&#xff1a;CCF-GESP 编程能力认证 C 七级 2024年9月份选择题详细解析-CSDN博客 目录 第 1 题 第 2 题 第 3 题 第 4 题 第 5 题 第 6 题 第 7 题 第 8 题 第 9 题 第 10 题 第 1 题 表达式 a << 1 的结果为 a&#xff08;错误&#xff09; 【a是字符常…...

ESP32-S3模组上跑通ES8388(20)

接前一篇文章:ESP32-S3模组上跑通ES8388(19) 二、利用ESP-ADF操作ES8388 2. 详细解析 上一回解析完了es8388_init函数中的第7段代码,本回继续往下解析。为了便于理解和回顾,再次贴出es8388_init函数源码,在components\audio_hal\driver\es8388\es8388.c中,如下: ​ …...

UE5.5 Geometry库平面切割原理分析

平面切割--FMeshPlaneCut 平面定义: 面上一个点 法线 算法流程如下 求几何体所有顶点和面的有向距离(Signs) Sign计算&#xff1a; float Sign (VertexPos - PlaneOrigin).Dot(PlaneNormal); 遍历所有几何体所有交叉边, 进行SplitEdge 对于位于切割面两侧的交叉边(Sign…...