TableViewComponent v2
Unity UGUI 自带的 ScrollView 控件不支持复用滚动内容,在数量大的情况下,界面容易卡顿
借鉴其他游戏控件,写了个可复用的滚动组件,扩展、优化了ScrollView
TableView 组件的基本逻辑是注册 ScrollRect 滚动事件,在滚动时实时计算位置,将移出可视区域的内容,移动到即将进入可视区域的位置,并修改内容
使用
添加游戏对象

Scroll View 添加组件

自定义脚本
实现自定义效果需要添加一个实现 ITableViewInterface 接口的脚本
public interface ITableViewInterface
{
/// <summary>
/// 设置 cell 显示内容
/// </summary>
/// <param name="idx">cell 索引</param>
/// <param name="gameObject">cell 对象</param>
void SetCellAtIdx(int idx, GameObject gameObject);
/// <summary>
/// 每个 cell 大小
/// </summary>
/// <param name="idx">cell 索引</param>
/// <returns>cell 大小</returns>
Vector2 CellSizeAtIdx(int idx);
/// <summary>
/// 列表总数据量
/// </summary>
/// <returns>数据量</returns>
int DataCount();
/// <summary>
/// 列表滚动方向,需要和 <code>ScrollRect</code> 方向一致
/// </summary>
/// <returns>滚动方向</returns>
TableViewComponent.TableDirection TableViewDirection();
}
添加处理 Cell 生成、回收接口(可选)
/// <summary>
/// 在 Cell 生成后、回收前,处理 Cell 子节点
/// </summary>
public interface ITableViewCell
{
/// <summary>
/// 生成 Cell ,此时可以添加子对象
/// </summary>
/// <param name="game">生成的 Cell</param>
void OnDequeue(int idx, GameObject cell);
/// <summary>
/// 回收 Cell ,此时可以回收 Cell 上的子对象
/// </summary>
void OnRecycle(int idx, GameObject cell);
}
TableView 组件的公共属性和功能
/// <summary>
/// 实现接口 ITableViewInterface 的对象
/// </summary>
public ITableViewInterface tableView { get; set; }
/// <summary>
/// 实现接口 ITableViewCell 的对象
/// </summary>
public ITableViewCell tableViewCell { get; set; }
/// <summary>
/// 是否自动加载数据,显示列表
/// <para>
/// 设置 false 时要手动调用 <see cref="ResetTable"/> 显示列表
/// </para>
/// </summary> 大专栏 TableViewComponent v2
public bool autoLoadOnStart { get; set; } = true;
/// <summary>
/// 返回第一个 cell 显示的区域比例(ratio) 大于 ratio 的索引
/// </summary>
/// <returns>索引</returns>
public int GetFirstShowRateIndex(float rate = 0.8f)
/// <summary>
/// 返回当前显示的所有 Cell 对象
/// </summary>
/// <returns>当前显示的所有 Cell 对象</returns>
public List<GameObject> GetShowingCells()
/// <summary>
/// 返回指定位置的 Cell, Cell 可能为 null
/// </summary>
/// <param name="idx">索引</param>
/// <returns>Cell</returns>
public GameObject GetCellAtIdx(int idx)
/// <summary>
/// 是否在滚动
/// </summary>
/// <returns>bool</returns>
public bool IsScrolling() { return DOTween.IsTweening(content); }
/// <summary>
/// 滚动到第 idx 个 cell
/// </summary>
/// <param name="idx">索引</param>
/// <param name="time">滚动时间</param>
public void ScrollToIndex(int idx, float time = 0.5f)
/// <summary>
/// 滚动列表完全显示第 idx 个 Cell
/// <para>当 Cell 完全显示时,不处理</para>
/// <para>当 Cell 在列表上面时,滚动到显示区域第一个</para>
/// <para>当 Cell 在列表下面时,滚动到显示区域最后一个</para>
/// <para>当 Cell 面积大于整个列表的显示面积时,滚动到显示区域第一个</para>
/// </summary>
/// <param name="idx">索引</param>
/// <param name="time">滚动时间</param>
public void ScrollToShow(int idx, float time = 0.5f)
/// <summary>
/// 跳到第 idx 个 cell
/// </summary>
/// <param name="idx">索引</param>
public void JumpToIndex(int idx)
/// <summary>
/// 更新 Idx 位置的 Cell
/// Cell 的大小不变,只更新显示内容
/// </summary>
/// <param name="idx">索引</param>
public void RefreshCellAtIndex(int idx)
/// <summary>
/// 刷新列表,保持当前位置
/// </summary>
public void RefreshTable()
/// <summary>
/// 刷新列表,有增删或某个 Cell 大小变化,刷新整个列表
/// </summary>
public void ResetTable()
自定义脚本获取到 TableView 组件,设置 tableView 属性
运行时,可以调用公共方法,更新列表或跳转到某个位置
运行效果

TableViewComponent v2的更多相关文章
- 如何搭建自己的SPRING INITIALIZR server
这两天在慕课学Spring boot ,用idea通过spring initializr新建项目 即使用代理连不上.无奈. 参考了 GitHub - spring-io/initializr: A w ...
- Atitit. 破解 拦截 绕过 网站 手机 短信 验证码 方式 v2 attilax 总结
Atitit. 破解 拦截 绕过 网站 手机 短信 验证码 方式 v2 attilax 总结 1. 验证码的前世今生11.1. 第一代验证码 图片验证码11.2. 第二代验证码 用户操作 ,比如 ...
- [Android]Android端ORM框架——RapidORM(v2.1)
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/6020412.html [Android]Android端ORM ...
- [Android]Android端ORM框架——RapidORM(v2.0)
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5626716.html [Android]Android端ORM ...
- JuCheap V2.0响应式后台管理系统模板正式发布beta版本
JuCheap V1.* 查看地址: http://blog.csdn.net/allenwdj/article/details/49155339 经过半年的努力,JuCheap后台通用响应式管理后台 ...
- Atitit. 项目文档目录大纲 总集合 v2
Atitit. 项目文档目录大纲 总集合 v2 -----Atitti.原有项目源码的架构,框架,配置与环境说明 v3 q511 -----Atitit.开发环境 与 工具 以及技术框架 以及 注意 ...
- python gettitle v2.0
#!/usr/bin/env python # coding=utf-8 import threading import requests import Queue import sys import ...
- ".NET Compact Framework v2.0 could not be found."
参考: http://blog.csdn.net/godcyx/article/details/7348431 问题原因: That's a known issue where VS can't di ...
- ASP.NET Identity V2
Microsoft.AspNet.Identity是微软在MVC 5.0中新引入的一种membership框架,和之前ASP.NET传统的membership以及WebPage所带来的SimpleMe ...
随机推荐
- 92.QuerySet API中的切片操作详细使用
切片操作: 使用情况分析:在我们的CSDN的个人主页会显示我们个人发布的多篇文章(20篇),如果还想查看更多,就可以点击最下方的"查看更多"按钮,在这里对首页的文章的个数的限制就用 ...
- HDU -1166 线段树
#include <algorithm> #include <iostream> #include<sstream> #include<cstring> ...
- drf三大认证补充
频率认证 源码分析部分 def check_throttles(self, request): for throttle in self.get_throttles(): if not throttl ...
- MACOSX下查看某个端口被哪个程序占用及杀进程方法
sudo lsof -i :9000 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME java 61342 a 313u IPv6 0x11111 ...
- linux epoll 任务队列多线程模型
/* * *EPOLL ET 触发必须使用非阻塞,LT触发可以阻塞/非阻塞. *read 函数 非阻塞读需 忙轮寻 soket关闭返回0,循环读完数据 *如果已经读完再读read返回 -1,errno ...
- top 命令中的VIRT,RES,SHR ,MEM区别
VIRT 表示进程的虚拟(地址)空间大小,其包含进程实际使用的大小(申请的堆栈), 使用mmap映射的大小,包括外设RAM, 还有映射到本进程的文件(例如动态库),还有进程间的共享内存.所以VIRT ...
- Class<T> 泛型获取T的class
getClass().getGenericSuperclass()返回表示此 Class 所表示的实体(类.接口.基本类型或 void)的直接超类的 Type然后将其转换ParameterizedTy ...
- eclipse配置svn若干点
eclipse 或者针对java的,或者eclipse for php ,都行. 可以直接在线安装svn插件,也可以下载好插件后自己配置. ------------ 一下转载自http://blog. ...
- 移植linux4.14内核到四核Exynos4412开发板
最近法师收到了很多留言,其中有一部分问法师什么时候更新,还有一大部分问法师我是买迅为的IMX6UL精英版好呢还是买4412精英版好呢,因为我们这俩个都不贵.法师的建议的是入手4412!为什么呢? 第一 ...
- class.forName() 和 classLoader 的区别
相同点: java中class.forName() 和 classLoader 都可用来对类进行加载 不同店: 1.class.forName()除了将类的 .class ...