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 ...
随机推荐
- 关于随机数 C++
void test() { srand();//这里设置了 说明又得从头开始循环一次了 //如果没有设置 它还是基于main函数里的srand(1) for(int i=;i<;i++) { c ...
- ROS 八叉树地图构建 - 使用 octomap_server 建图过程总结!
构建语义地图时,最开始用的是 octomap_server,后面换成了 semantic_slam: octomap_generator,不过还是整理下之前的学习笔记. 一.增量构建八叉树地图步骤 为 ...
- 【API进阶之路】帮公司省下20万调研费!如何巧用情感分析API实现用户偏好调研
摘要:自从学习API后,仿佛解锁了新技能,可别小看了一个小小的API接口,用好了都是能力无穷.这不,用情感分析API来做用户偏好调研,没想到这么一个小创意给公司省了20万调研费用. 上次借着高考热点整 ...
- HTML学习第三天
超链接: <a href=""></a> target链接打开方式 1._blank新窗口打开 2._self当前窗口打开 ...
- LeetCode 64最小路径和
题目 给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小. 说明:每次只能向下或者向右移动一步. 示例: 输入: [ [1,3,1], [1,5 ...
- 实型(浮点型):float、double
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #include<stdlib. ...
- chaos;head移植版缺失python27.dll SDL2.dll问题解决
注意 不要在目录名中有字符' ; '
- Maven工程 install和run包配置
1.New一个Environment变量: Name:global.config.path Value:D:\490993\config;
- html表格、表单
知识点一:表格 1.表格标签 table 2.表格的组成 行 tr 单元格 td 3.建立表格步骤 1.建立表格, 2.判断行数和列数 3.用行去包含单元格 4.在每个单元格中去添加内容 4. ...
- PMI-ACP认证,你了解多少?
PMI-ACP ®(敏捷管理专业人士)认证是由美国项目管理协会(PMI ®)于2011年推出的一门敏捷项目管理考试科目,全称Agile Certified Practitioner.PMI-ACP®证 ...