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. NOIpDairy

    Day 0 水水比赛 Day 1 写写Dp Part1:Dp基础练习 [HNOI2002]公交车路线 秒切,点数这么少,N这么大,目测O(N)+暴力更新 5min写完 P3842 [TJOI2007] ...

  2. c#为什么要用事物

    一.事务的定义 所谓事务,它是一个操作集合,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位.典型的例子就像从网上银行系统的帐户A转帐到帐户B,它经过两个阶段:1.从帐户A取出款项.2.把 ...

  3. msgfmt - 翻译汉化

    说明 目前大部分自由软件实现国际化使用的是gettext. 国际化就是让程序可以使用多国语言来显示程序里的字符串. 程序里一般都有很多字符串,菜单名也好,错误信息也好,都是字符串.假设字符串为stri ...

  4. 关于volatile关键字

    来源:衡阳网站优化 在java核心卷1中对volatile关键字是这么描述的: volatile关键字为实例域的同步访问提供了一种免锁机制.如果声明一个域为volatile,那么编译器和虚拟机就知道该 ...

  5. Codeforces 1293A - ConneR and the A.R.C. Markland-N

    题目大意: ConneR老师想吃东西,他现在在大楼的第s层,大楼总共有n层,但是其中有k层的餐厅关门了. 然后给了这k层关门的餐厅分别所在的楼层. 所以问ConneR老师最少得往上(或者往下)走几层楼 ...

  6. Git log 中文乱码

    以下三条命令搞定(系统是centos  7.4) git config --global i18n.commitencoding utf-8 git config --global i18n.logo ...

  7. open 管道用法|Getopt::Long

    #!/usr/bin/perl use strict; use warnings; use Getopt::Long; my ($number,$in,$out); GetOptions( " ...

  8. 牛客-Forsaken的数列(Treap)

    题目传送门 sol:第一次看题还真信了是用线段树来做,但是没什么想法,看了题解发现是我不会的Treap,然后花了几天时间学习了一下并补掉题目 无旋Treap #include <bits/std ...

  9. redis中间件

    redis的集群:集群策略:主从复制(从库从主库同步获取数据,本身不提供服务)哨兵(监控主库和从库,当主库挂的时候自动把从库选一个切换为主库,主库存放的是全量数据)集群参考:https://blog. ...

  10. 2010提高组-C]关押罪犯(扩展域并查集

    题:https://www.cometoj.com/problem/0073 #include<bits/stdc++.h> using namespace std; ; struct n ...