Unity3d UGUI插件之TSTableView
TSTableView是Tacticsoft工作室开发的一款适用于UGUI的列表(Table)插件,设计灵感来源于iOS/Mac的UITableView,提供高复用、高性能的列表,其主要特点是:
采用MVC模式
良好的性能和内存占用优化
复用列表项
遗憾的是它暂时不支持横向列表,需要开发者自己扩展,还有就是优化无止境。
首先介绍下TSTableView的使用方法。
上图是TSTableView编辑时的层次结构。TableViewContainer节点挂载Mask(UGUI)组件,同ScrollView(UGUI)一样用于列表显示区域的裁剪。TableView节点挂载了TableView组件和ScrollRect(UGUI)组件。TableViewContent节点挂载了VerticalLayoutGroup组件,用于列表项的纵向布局。
TSTableView设计上采用MVC模式,View功能由TableView提供,控制显示和处理用户输入;实现ITableViewDataSource接口的类实现Model功能,提供列表数据;自定义一个Controller组件来控制视图和通知状态改变,为TableView设置数据源,需要将它挂载到具体对象上。
其中ITableViewDataSource定义如下,它为TableView提供列表项数量、列表项高度、创建列表项接口:
public interface ITableViewDataSource
{
// get the number of rows that a certain table should display
int GetNumberOfRowsForTableView(TableView tableView);
// get the height of a row of a certain cell in the table view
float GetHeightForRowInTableView(TableView tableView, int row);
// create a cell for a certain row in a table view,
// callers should use tableView.GetReusableCell to cache objects.
TableViewCell GetCellForRowInTableView(TableView tableView, int row);
}
除此之外,需要提供列表项预制件,它设计了具体的列表显示,需要挂载TableViewCell子类组件和LayoutElement组件,以便TableView能够识别和调用相关接口。
以下是TSTableView运行时的层次结构:
TableViewContent节点下存放所有正在使用的列表项,其中TopContentPlaceHolder和BottomContentHolder提供占位功能,缓存的列表项放在隐藏的ReusableCell节点下。
接下来重点讨论TableView的设计原理。
TableView维护一个可见列表项字典和一个缓存列表项字典,可见列表项使用字典(Dictionary)相比列表(List)会占用更多内存空间,但查找、删除效率更高,其实可以考虑使用链表(LinkedList)可能更好一些。缓存列表因为需要支持不同列表项的混排,采用按标识字符串做key的字典,value使用链表来串起同类列表项。
private Dictionary<int, TableViewCell> m_visibleCells;
private Dictionary<string, LinkedList<TableViewCell>> m_reusableCells;
TableView层次结构上非常巧妙地设计两个占位项来动态计算和伸缩占位空间,分别是TopContentPlaceHolder和BottomContentPlaceHolder,它们挂载LayoutElement组件,能够动态改变占位空间。
假定当前使用的是一个超长列表。初始状态下,不需要TopContentPlaceHolder占位隐藏即可,除了视口可见的几个列表项,其余列表项因为不可见无需在列表中存在,而内容空间空间都由BottomContentPlaceHolder来完成,此时无缓存项。上面是层次结构和布局示意图。
随着列表滑动到中间位置,TopContentPlaceHolder和BottomContentPlaceHolder同时可见,它们分别代表视口之上的不可见空间和视口之下的不可见空间。视口中可显示的列表项数目不预知,因为每个列表项的高度可变,列表项可以是不同类型,所以列表在不同滑动位置,缓存字典中的缓存项数目会动态变化。上面是层次结构和布局示意图。
当列表项滑动到底部时,底部不需要占位项BottomContentPlaceHolder,顶部占位项TopContentPlaceHolder则会占取视口之外的内容空间。上面是层次结构和布局示意图。
为了维持可见列表和计算当前上下占位空间的大小,TableView维护了两个数组。一个是各列表项高度值数组(包含留白),会随着列表初始化、删除和添加列表项、列表重建,相对应地重建和修改高度值数组。另一个是各列表项累积高度值数组,记录各列表项距顶部的高度值,可以用来快速计算并获取当前视口中可见的列表项。同时使用一个已累积索引变量来记录已计算累积高度值的索引,这样可以在需要的时候才去完成累积值计算,得到惰性计算的目的。
public float[] m_rowHeights;
private float[] m_cumulativeRowHeights;
private int m_cleanCumulativeIndex;
TSTableView是一个针对超长列表的小巧插件,其设计上巧妙地利用现有UGUI组件来达到高复用、高性能的列表效果,可以为我们自定义控件提供一些设计上的方法。
附上:
开源网址: https://bitbucket.org/tacticsoft/tstableview
Unity3d UGUI插件之TSTableView的更多相关文章
- Unity3d UGUI 通用Confirm确认对话框实现(Inventory Pro学习总结)
背景 曾几何时,在Winform中,使用MessageBox对话框是如此happy,后来还有人封装了可以选择各种图标和带隐藏详情的MessageBox,现在Unity3d UGui就没有了这样的好事情 ...
- unity3d 游戏插件 溶解特效插件 - Dissolve Shader
unity3d 游戏插件 溶解特效插件 - Dissolve Shader 链接: https://pan.baidu.com/s/1hr7w39U 密码: 3ed2
- 出售 unity3d串口插件
出售unity3d串口插件 利用C++编写,解决了mono库 serialport的bug. serialport串口的bug地方在于: 1.有一些数据无法收到. 2.会丢失第一个字节. 3.延迟 我 ...
- 【Unity3d游戏开发】UGUI插件入门之游戏菜单
ugui是unity4.6开始加入的一个新的ui系统,非常强大,下面我们将通过一系列博客的方式一起来学习一下ugui的使用.本篇博客会介绍如何使用ugui制作一个游戏菜单,并且了解如何让物体与ugui ...
- Unity3D框架插件uFrame实践记录(一)
1.概览 uFrame是提供给Unity3D开发者使用的一个框架插件,它本身模仿了MVVM这种架构模式(事实上并不包含Model部分,且多出了Controller部分).因为用于Unity3D,所以它 ...
- Unity3D UGUI之ScrollView弹簧效果
unity3d版本5.3.2p4 UGUI中ScrollView包含Viewport(Content) ScrollView包含脚本.其Movement Type一共3个选项.Elastic就是弹簧效 ...
- Unity3D 常用插件
1.FX Maker FX Maker是一款制作特效的工具,它专为移动操作系统做了优化.FX Maker包括300种Prefab特效,300种纹理结构.100种网格.100种曲线效果.支持英文和韩文, ...
- Unity3D 集合插件目录
http://unity3d.9ria.com/?p=2171 这个基本上很全 下面自己觉的还不错的,当然那些大众的就不列出来了 一.KGFMapSystem Quick Start : http:/ ...
- Unity3D TouchScript 插件教程一
只是个人学习小记,谈不上教程,但是为了命中搜索引擎关键词,只好装逼了:),可能对于大家来说太简单了吧,网上中文教程没搜到 ,只好自己摸索了. 插件资源下载地址:https://www.assetsto ...
随机推荐
- 【python接口自动化】- logging日志模块
前言:我们之前运行代码时都是将日志直接输出到控制台,而实际项目中常常需要把日志存储到文件,便于查阅,如运行时间.描述信息以及错误或者异常发生时候的特定上下文信息. logging模块介绍 Pyth ...
- Linux命令持续学习
1 基础命令 1 jps 查看后台运行的java相关的程序 jvm调优所有 2 ps -ef | grep java 查询后台运行的程序(通过关键字) 3 cd - 回到上一级目录 4 vim之后输 ...
- OpenCV开发笔记(六十九):红胖子8分钟带你使用传统方法识别已知物体(图文并茂+浅显易懂+程序源码)
若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...
- Linux安装python 3
方法: 1.官网下载地址:http://www.python.org/download/ 2.rz -y 上传到Linux 解压tar -xvzf Python-3.5.1.tgz 进入目录 ...
- NGINX+PHP+POSTGRESQL+ZABBIX 5.X
安装前准备工作 系统及应用版本 centos 8.3 nginx 1.18 php 7.4.8 postgresql 12.3 zabbix 5.0.2 安装编译环境依赖包 dnf -y instal ...
- Java—接口
接口概念 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的”类”. 接口只描述所应该具备的方法,并没有具体实现,具体的实现由接口的实现类(相当于接口的子类)来完成.这样将功能的定义与实 ...
- C#LeetCode刷题之#205-同构字符串(Isomorphic Strings)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3770 访问. 给定两个字符串 s 和 t,判断它们是否是同构的. ...
- .net 跨平台桌面程序 avalonia:从项目创建到打包部署linux-64系统deepin 或 ubuntu。
介绍: 目前微软还没有跨平台桌面程序的开发框架.github上有一个团队开始自行研发跨平台桌面框架,其中一款叫avalonia.avalonia 采用 Xaml+C#,类似于wpf,可运行于.netf ...
- 源码剖析Springboot自定义异常
博主看到新服务是封装的自定义异常,准备入手剖析一下,自定义的异常是如何进行抓住我们请求的方法的异常,并进行封装返回到.废话不多说,先看看如何才能实现封装异常,先来一个示例: @ControllerAd ...
- Spring,SpringMVC,MyBatis,Hibernate,Servlet的生命周期,jsp有哪些内置对象,Tomcat,Cookie和Session的作用以及区别,oracle,MYSQL等面试题总结
1. 什么是Spring,谈谈你对Spring的理解 Spring是我们JAVA开发人员在搭建后台时选用的一个轻量级的开源框架,Spring框架目前也是功能丰富,十分优秀企业级采用最多的一个框架. S ...