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的更多相关文章

  1. 如何搭建自己的SPRING INITIALIZR server

    这两天在慕课学Spring boot ,用idea通过spring initializr新建项目 即使用代理连不上.无奈. 参考了 GitHub - spring-io/initializr: A w ...

  2. Atitit. 破解  拦截 绕过 网站 手机 短信 验证码  方式 v2 attilax 总结

    Atitit. 破解  拦截 绕过 网站 手机 短信 验证码  方式 v2 attilax 总结 1. 验证码的前世今生11.1. 第一代验证码 图片验证码11.2. 第二代验证码  用户操作 ,比如 ...

  3. [Android]Android端ORM框架——RapidORM(v2.1)

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/6020412.html [Android]Android端ORM ...

  4. [Android]Android端ORM框架——RapidORM(v2.0)

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5626716.html [Android]Android端ORM ...

  5. JuCheap V2.0响应式后台管理系统模板正式发布beta版本

    JuCheap V1.* 查看地址: http://blog.csdn.net/allenwdj/article/details/49155339 经过半年的努力,JuCheap后台通用响应式管理后台 ...

  6. Atitit. 项目文档目录大纲 总集合  v2

    Atitit. 项目文档目录大纲 总集合  v2 -----Atitti.原有项目源码的架构,框架,配置与环境说明 v3 q511 -----Atitit.开发环境 与 工具 以及技术框架 以及 注意 ...

  7. python gettitle v2.0

    #!/usr/bin/env python # coding=utf-8 import threading import requests import Queue import sys import ...

  8. ".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 ...

  9. ASP.NET Identity V2

    Microsoft.AspNet.Identity是微软在MVC 5.0中新引入的一种membership框架,和之前ASP.NET传统的membership以及WebPage所带来的SimpleMe ...

随机推荐

  1. Linux下切换用户出现su: Authentication failure的解决办法

    在切换用户时,密码没有输错,但始终无法成功地切换,还报出身份验证失败的错误,下面是具体解决方案: 在终端上输入指令sudo passwd root 此时输入你的密码 重复再次输入你的密码 再次用su指 ...

  2. 填平新版本Xcode安装插件不成功的坑

    一般情况下,安装xcode不成功现象基本上都出现在更新xcode或者重装之后出现的情况,下面原理性德东西,我就不赘述了,度娘上很容易看到,通过这段只是希望大家花费尽量少得时间将xcode插件安装成功. ...

  3. vim下看C++代码

    看C++代码, 缺少合适的编辑器,捣鼓vim. 安装Vundle, 用于插件管理 git clone https://github.com/VundleVim/Vundle.vim.git ~/.vi ...

  4. Spring Boot Session 超时时间

    springboot session https://www.jianshu.com/p/523572937db8 springboot2以上版本设置session超时时间 https://blog. ...

  5. 讯飞语音的中的bug用户校验失败

    用户校验失败:原因是目录没有复制粘贴正确. 下面是刚刚下载的SDK目录: 下面的是自己Android工程中的目录:注意复制粘贴的文件路径要正确

  6. 关于TensorFlow2的tf.function()和AutoGraph的一些问题解决

    在使用TensorFlow的AutoGraph的时候出现了一些问题,特此记录 AutoGraph did not convert this function. Try decorating it di ...

  7. Pandas Series 对象的loc与iloc区别

    import pandas as pd temp = pd.Series([,,,,]) loc用法: temp.loc[:] 0 1 1 2 2 3 3 4 # 输出索引为0-3的值(基于索引) t ...

  8. www、数组的equals、接口和抽象类、装箱拆箱、final赋值

    目录 2019.12.31 刷题笔记 2019.12.31 刷题笔记 www www是World Wide Web的缩写 数组的equals 数组是一个对象,不同类型的数组具有不同的类.数组是一种引用 ...

  9. Linux安装vmtools工具

    1.vmware菜单中虚拟机下安装vmtools: 2.将/mnt/cdrom/下的文件copy至可读写的文件夹下,此处我选择downloads目录下(如果提示此文件夹只为可读文件夹时) 3.使用ta ...

  10. 微弱信号二次谐波检测的FPGA的实现-总结

    首先还是把握大的系统框架: 我要实现的部分不包括DA以及AD的转换,主要是将SSP接收到的数据送入到FIFO中,然后经过FIR带通滤波器的处理后对该信号计算幅值并做PSD,然后处理的信号经过积分够一方 ...