设计目的
带遮罩(Mask)的滚动(ScrollRect)组件都有一个共同的优化点,就是创建的元素数量只需要满足遮罩的显示大小即可,比如遮罩内最多能显示6个元素的滚动组件,无论需要显示的数据量有多少,只需要创建6个元素即可(如下图)我们要处理的,就是在滚动的过程中不断地复用已有的元素。
基类定义
结合之前写过的滚动组件:滚动表格组件 、翻页组件 、树形组件 可以把复用的逻辑提取为——把滚动组件的所有元素按显示顺序生成对应的显示下标,计算遮罩内显示下标的范围,并生成显示范围内的元素,当滚动时,判断显示下标的范围是否发生变化,如果是,则对显示范围内的元素进行更新 下面是这部分逻辑的代码:
function LBaseScroll:_OnValueChanged(value)
...
if self.orderStartIndex ~= self:_GetOrderStartIndex() or
self.orderEndIndex ~= self:_GetOrderEndIndex() then
self:_Update()
end
end
为何要用显示下标,而不用数据本身的下标,因为显示下标与元素的数据下标是不一致的 比如一个水平滚动,元素水平排布的2行2列翻页组件,黄色格子内是数据的实际下标,红色数据为显示下标,显示下标的排序方式与滚动的方向相关
注意事项
滚动复用组件基类命名为LBaseScroll,继承LBaseScroll的父类一般需要重写三个接口 获取遮罩范围内的起始显示下标:_GetOrderStartIndex() 获取遮罩范围内的结束显示下标:_GetOrderEndIndex() 把显示下标转换为数据下标:_OrderIndexToIndex()
项目地址
git地址 (LBaseScroll类) Unity版本:5.6.6