299 lines
8.4 KiB
Lua
299 lines
8.4 KiB
Lua
local UIPrefabObject = require "app/bf/unity/uiprefab_object"
|
||
local ScrollRectBase = class("ScrollRectBase", LuaComponent)
|
||
|
||
function ScrollRectBase:init()
|
||
self:initBFScrollRect()
|
||
self.cellList = {}
|
||
|
||
-- c#层实例化后调用
|
||
self.bfScrollRect:SetOnInstantiateCellAction(function(gameObject)
|
||
if self:isDestroyed() then
|
||
ResourceManager:destroyPrefab(gameObject)
|
||
return
|
||
end
|
||
local prefabObject = UIPrefabObject:create()
|
||
prefabObject:initWithGameObject(gameObject)
|
||
prefabObject:initPrefabHelper()
|
||
prefabObject:genAllChildren()
|
||
self.baseObject:addChildList(prefabObject)
|
||
|
||
if self.needFade then
|
||
local fadeTime = self.fadeTime or 0.3
|
||
if fadeTime > 0 then
|
||
local canvasGroup = prefabObject:getComponent(GConst.TYPEOF_UNITY_CLASS.CANVAS_GROUP)
|
||
if not canvasGroup then
|
||
canvasGroup = prefabObject:addComponent(GConst.TYPEOF_UNITY_CLASS.CANVAS_GROUP)
|
||
end
|
||
canvasGroup.alpha = 0
|
||
local tween = canvasGroup:DOFade(1, fadeTime)
|
||
tween:SetEase(CS.DG.Tweening.Ease.InOutSine)
|
||
tween:SetLink(gameObject)
|
||
end
|
||
end
|
||
|
||
local cell = prefabObject:addLuaComponent(self.initCallback())
|
||
if self.initFinishCallback then
|
||
self.initFinishCallback(cell)
|
||
end
|
||
table.insert(self.cellList, cell)
|
||
end)
|
||
|
||
self.bfScrollRect:SetRefreshAction(function(dataIndex, cellIndex)
|
||
if self:isDestroyed() then
|
||
return
|
||
end
|
||
local cell = self.cellList[cellIndex]
|
||
if self.refreshCallback and cell then
|
||
cell:setIndex(dataIndex)
|
||
self.refreshCallback(dataIndex, cell)
|
||
end
|
||
end)
|
||
|
||
self.bfScrollRect:SetSelectedAction(function(isSelected, cellIndex)
|
||
if self:isDestroyed() then
|
||
return
|
||
end
|
||
local cell = self.cellList[cellIndex]
|
||
if self.selectedCallback and cell then
|
||
self.selectedCallback(isSelected, cell)
|
||
end
|
||
end)
|
||
self.bfScrollRect:SetAnchoredPositionChange(function(x, y)
|
||
if self:isDestroyed() then
|
||
return
|
||
end
|
||
if self.anchoredPositionChangeCallback then
|
||
self.anchoredPositionChangeCallback(x, y)
|
||
end
|
||
end)
|
||
end
|
||
|
||
function ScrollRectBase:initBFScrollRect()
|
||
self.bfScrollRect = self.baseObject:getComponent(GConst.TYPEOF_UNITY_CLASS.BF_SCROLL_RECT)
|
||
end
|
||
|
||
---- 淡入参数 initCellTime(多久加载一个cell,当为0时会一帧加载一个),fadeTime(渐显时长)
|
||
function ScrollRectBase:setFadeArgs(initCellTime, fadeTime)
|
||
self.initCellTime = initCellTime
|
||
self.fadeTime = fadeTime
|
||
end
|
||
|
||
---- 添加init回调
|
||
function ScrollRectBase:addInitCallback(callback)
|
||
self.initCallback = callback
|
||
end
|
||
|
||
---- 添加loadCell完成回调
|
||
function ScrollRectBase:addInitFinishCallback(callback)
|
||
if self.cellList then
|
||
for k, v in ipairs(self.cellList) do
|
||
callback(v)
|
||
end
|
||
end
|
||
self.initFinishCallback = callback
|
||
end
|
||
|
||
---- 添加refresh回调
|
||
function ScrollRectBase:addRefreshCallback(callback)
|
||
self.refreshCallback = callback
|
||
end
|
||
|
||
---- 添加选中回调
|
||
function ScrollRectBase:addSelectedCallback(callback)
|
||
self.selectedCallback = callback
|
||
end
|
||
|
||
---- 添加滑动回调
|
||
function ScrollRectBase:addAnchoredPositionChangeCallback(callback)
|
||
self.anchoredPositionChangeCallback = callback
|
||
end
|
||
|
||
---- 设置scroll rect 总数量
|
||
function ScrollRectBase:setTotalCount(count)
|
||
self.totalCount = count
|
||
self.bfScrollRect:SetTotalCount(count)
|
||
end
|
||
|
||
function ScrollRectBase:getTotalCount()
|
||
return self.totalCount
|
||
end
|
||
|
||
---- 设置选中的index
|
||
function ScrollRectBase:setSelected(selectIndex)
|
||
self.bfScrollRect:SetSelected(selectIndex)
|
||
end
|
||
|
||
function ScrollRectBase:refreshAll()
|
||
if self.sid then
|
||
SchedulerManager:unscheduleGlobal(self.sid)
|
||
self.sid = nil
|
||
self.bfScrollRect:SetTotalCount(self.totalCount)
|
||
end
|
||
self.bfScrollRect:RefreshAll()
|
||
end
|
||
|
||
function ScrollRectBase:refillCells(totalCount, needFade, targetIndex, fadeCount)
|
||
self.totalCount = totalCount or self.totalCount
|
||
self.needFade = needFade
|
||
|
||
if targetIndex then
|
||
self.needFade = false
|
||
end
|
||
|
||
if self.sid then
|
||
SchedulerManager:unscheduleGlobal(self.sid)
|
||
self.sid = nil
|
||
end
|
||
|
||
-- 1个C#计算有个bug 不能直接用SetTotalCount
|
||
if totalCount == 1 then
|
||
self.bfScrollRect:RefillCells(totalCount)
|
||
return
|
||
end
|
||
if self.needFade then
|
||
-- self.bfScrollRect:RefillCells(0)
|
||
self.bfScrollRect:SetTotalCount(0)
|
||
local curCount = 0
|
||
local delay = self.initCellTime or 0.1
|
||
self.sid = SchedulerManager:scheduleGlobal(function()
|
||
if curCount == self.totalCount then
|
||
self.sid = nil
|
||
self.needFade = false
|
||
return true
|
||
else
|
||
if self.baseObject:isDestroyed() then
|
||
self.sid = nil
|
||
self.needFade = false
|
||
return true
|
||
end
|
||
if fadeCount and fadeCount == curCount then
|
||
self.needFade = false
|
||
if self.sid then
|
||
SchedulerManager:unscheduleGlobal(self.sid)
|
||
self.sid = nil
|
||
end
|
||
self.bfScrollRect:SetTotalCount(self.totalCount)
|
||
else
|
||
curCount = curCount + 1
|
||
self.bfScrollRect:SetTotalCount(curCount)
|
||
end
|
||
end
|
||
end, delay)
|
||
else
|
||
self.bfScrollRect:RefillCells(self.totalCount, targetIndex or 0)
|
||
end
|
||
end
|
||
|
||
function ScrollRectBase:updateAllCellByIdx(idx)
|
||
for i = 1, #self.cellList do
|
||
local cell = self.cellList[i]
|
||
if self.refreshCallback and cell and cell:getIndex() == idx then
|
||
local dataIndex = cell:getIndex()
|
||
self.refreshCallback(dataIndex, cell)
|
||
end
|
||
end
|
||
end
|
||
|
||
function ScrollRectBase:updateAllCell()
|
||
for i = 1, #self.cellList do
|
||
local cell = self.cellList[i]
|
||
if self.refreshCallback and cell then
|
||
local dataIndex = cell:getIndex()
|
||
if dataIndex <= self.totalCount then
|
||
self.refreshCallback(dataIndex, cell)
|
||
end
|
||
end
|
||
end
|
||
end
|
||
|
||
function ScrollRectBase:getAllCellAndIndex(callback)
|
||
for i = 1, #self.cellList do
|
||
local cell = self.cellList[i]
|
||
if cell then
|
||
local dataIndex = cell:getIndex()
|
||
if dataIndex <= self.totalCount and dataIndex > 0 then
|
||
callback(dataIndex, cell)
|
||
end
|
||
end
|
||
end
|
||
end
|
||
|
||
function ScrollRectBase:moveToIndex(targetIndex)
|
||
targetIndex = targetIndex or 0
|
||
self.bfScrollRect:MoveToIndex(targetIndex)
|
||
end
|
||
|
||
---- 清除cell
|
||
function ScrollRectBase:clearCells()
|
||
self.bfScrollRect:ClearCells()
|
||
end
|
||
|
||
function ScrollRectBase:removeCell(index)
|
||
self.bfScrollRect:RemoveCell(index)
|
||
end
|
||
|
||
function ScrollRectBase:setTopRecoveryOffset(offset)
|
||
self.bfScrollRect:SetTopRecoveryOffset(offset)
|
||
end
|
||
|
||
function ScrollRectBase:getTopRecoveryOffset()
|
||
return self.bfScrollRect:GetTopRecoveryOffset()
|
||
end
|
||
|
||
function ScrollRectBase:setDownRecoveryOffset(offset)
|
||
self.bfScrollRect:SetDownRecoveryOffset(offset)
|
||
end
|
||
|
||
function ScrollRectBase:getDownRecoveryOffset()
|
||
return self.bfScrollRect:GetDownRecoveryOffset()
|
||
end
|
||
|
||
function ScrollRectBase:getBFScrollRect()
|
||
return self.bfScrollRect
|
||
end
|
||
|
||
function ScrollRectBase:StopMovement()
|
||
self.bfScrollRect:StopMovement()
|
||
end
|
||
|
||
function ScrollRectBase:onDestroy()
|
||
LuaComponent.onDestroy(self)
|
||
if self.sid then
|
||
SchedulerManager:unscheduleGlobal(self.sid)
|
||
self.sid = nil
|
||
end
|
||
end
|
||
|
||
function ScrollRectBase:getListCellByIndex(index)
|
||
for _, value in ipairs(self.cellList) do
|
||
if value:getIndex() == index then
|
||
return value
|
||
end
|
||
end
|
||
end
|
||
|
||
function ScrollRectBase:getListCell()
|
||
return self.cellList
|
||
end
|
||
|
||
function ScrollRectBase:setCellHeight(height)
|
||
self.bfScrollRect:SetCellHeight(height)
|
||
end
|
||
|
||
function ScrollRectBase:setCellWidth(width)
|
||
self.bfScrollRect:SetCellWidth(width)
|
||
end
|
||
|
||
function ScrollRectBase:setPerLineNum(num)
|
||
self.bfScrollRect:SetPerLineNum(num)
|
||
end
|
||
|
||
function ScrollRectBase:getCellWidth()
|
||
return self.bfScrollRect.CellWidth
|
||
end
|
||
|
||
function ScrollRectBase:getCellHeight()
|
||
return self.bfScrollRect.CellHeight
|
||
end
|
||
|
||
return ScrollRectBase |