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 ...
随机推荐
- 笨办法学习python3练习代码:argv参数变量与文件操作
ex15.py 完成ex15.py需要在ex15.py同文件夹目录下面准备一个txt文件(ex15_sample.txt) 执行ex15.py 如: python ex15.py e ...
- windows下使用redis命令行模式查询数据
背景:redis的火,就像java一样,对于测试人员来说,使用它就需要好好搞下,现在就整理下命令行模式,来查询获取自己想要的值: 命令行连接命令:redis-cli -h 主机名 -p 端口号 -a ...
- 郭超:阿里云Cassandra背后的故事
大家好,我是阿里云数据库产品事业部的玄陵,真名郭超. 本次的分享大概分三个部分:Cassandra云数据库简介.Cassandra云数据库特性以及Q&A. 我们先了解一下Cassand ...
- cryptopp使用Qt mingw编译,以及海思平台交叉编译
编译工程生成,使用qmake生成qt工程文件(海思平台时,要用海思平台的qmake),将 TEMPLATE = app 修改为: TEMPLATE = lib 添加如下: win32:LIBS += ...
- 学生成绩管理系统-JAVA语言测试
首先右键新建一个工程project 选择Java Project,单击next下一步 project命名为“学生成绩管理系统”,点击finish继续 右键src文件夹新建Package包,取名为te ...
- CSS品控与流程
精通CSS意味着不仅能写出可用的标记和样式,还能让代码好阅读.方便移植.易维护. 1.外部代码质量:调试CSS 外部代理质量就是用户能体验到的最终结果.主要体现在几个方面. 正确性.CSS属性名都写对 ...
- ubuntu升级已安装git版本
# To get the very latest version of git, you need to add the PPA (Personal Package Archive) from the ...
- matlab使用libsvm入门教程——使用matlab安装配置libsvm以及一个svm分类实例
前言 此教程专注于刚入门的小白, 且博客拥有时效性, 发布于2019年3月份, 可能后面的读者会发现一些问题, 欢迎底下评论出现的问题,我将尽可能更新解决方案. 我开始也在如何安装libsvm上出现了 ...
- 汇编 | x86汇编指令集大全(带注释)
做mit-6.828的时候遇到了很多汇编知识,但是无奈学校还没学汇编,只能狠心啃啃硬骨头,在网上查到了很多的资料,归档!方便查看 ----------------------------------- ...
- 单元测试新方法:用setUp方法 @Before注释
public class CentralizedPUDMatchServicePacTest { PacMatchService pacMatchService; @Before public voi ...