scv.lua (可能还需完善)
local scroll = {} --这个版本尽量少用乘法,removeFromParent,addChild
local MARGIN_UP = 0
local MARGIN_LEFT = 0
local MARGIN_V_BETWEEN = 0
local MARGIN_H_BETWEEN
local NUM_PER_ROW
local THRESHOLD -- 与self['node' .. iHead]相对Container的高度差阈值
local NODE_IHEAD_POS --inner的子节点位置高度 ,每次inner height 有变化都要更新
--[[
marginV: item间垂直间距,默认为 0
marginUp: 上下空白长度, 默认为 0
marginLeft: 左右空白长度,默认为 0
]]
function scroll:set_margin(marginV, marginUp, marginLeft) --如果不调set_margin将使用上次的margin,整个游戏第一次调用前为上面的值
ccprint("set_margin enter")
MARGIN_V_BETWEEN = marginV or 0
MARGIN_UP = marginUp or 0
MARGIN_LEFT = marginLeft or 0
end
--[[
modName: 模块名
reuseLastRes : 是否重用上次的资源,比如同一个页面中不同标签的item都是一样,则可以复用上次的
refScv: scroll view
refItem: item,要能克隆 item:clone() ,和获得item大小 item:getContentSize()
refData: 数据table, 用 #refData可获取长度
numPerRow: 每行item个数 ,默认为 1
startRow: 希望从第几行开始显示, 默认为 1 ,程序会根据情况调整至合理位置
]]
function scroll:create( modName, reuseLastRes, refScv, refItem, refData, numPerRow, startRow)--一个页面中打开一个标签使用一次,上次的scv作废,但下面有方法还原状态
ccprint("create enter ")
if not reuseLastRes then
self:onExit() --主要为释放上一次的资源
self.item = refItem
self.item:ignoreAnchorPointForPosition(false)
self.item:setAnchorPoint(0, 0)
self.item:retain()
else -- 以防出错,先把handle和listener关掉
ccprint("Re use ...")
if self.handle then
cc.Director:getInstance():getScheduler():unscheduleScriptEntry(self.handle)
self.handle = nil
end
if self.listener1 then
-- self.modSelf._core:getEventDispatcher():removeEventListener(self.listener1)
cc.Director:getInstance():getEventDispatcher():removeEventListener(self.listener1)
self.listener1 = nil
end
if self.item_touch_enabled then --重用了但点击事件注销,目前这么写吧
self.item_touch_enabled = false
end
end
self.modName = modName
self.modSelf = _G[modName].getInstance()
self.scv = refScv
self.inner= self.scv:getInnerContainer()
self.data = refData
self.item_width = self.item:getContentSize().width
self.item_height = self.item:getContentSize().height
self.scv_width = self.scv:getContentSize().width
self.scv_height = self.scv:getContentSize().height
self.scv:setInnerContainerSize(cc.size(self.scv_width, self.scv_height)) --这个很重要,否则inner会有偏移(受上次位置影响)
--self.inner:setPosition(0, 0) -- 这句在垂直滑动不是必须的,垂直滑动在上句会自动调回原点
NUM_PER_ROW = numPerRow or 1
MARGIN_H_BETWEEN = 0
if NUM_PER_ROW ~= 1 then
MARGIN_H_BETWEEN = (self.scv_width - 2 * MARGIN_LEFT - NUM_PER_ROW * self.item_width) / (NUM_PER_ROW - 1)
MARGIN_H_BETWEEN = math.max(0, MARGIN_H_BETWEEN)
end
THRESHOLD = self.scv_height + self.item_height / 2 + MARGIN_V_BETWEEN + self.item_height
self.pre_iHead = self.iHead --当reuseLastRes 为 true的情形这句才有效
self.iHead = startRow or 1
--self:set_new_iHead_iTail() -- self:reuse_pre_rows() 内有矫正
self.pre_iHead = self.pre_iHead or self.iHead
self:reuse_pre_rows() --这个函数有复用,删除,新增综合功能
self:head_tail_head_tail()
self.delY = 0 -- monitor()内会率先用到
local function monitor()
self:monitor()
end
self.handle = cc.Director:getInstance():getScheduler():scheduleScriptFunc(monitor, 0, false)
local function onTouchBegan(touch, event)
self.delY = 0
return true
end
local function onTouchMoved(touch, event)
self.delY = touch:getLocation().y - touch:getPreviousLocation().y
end
local function onTouchEnded(touch, event)
if self.delY == 0 then
if self.item_touch_enabled and self.iTail ~= 0 then --不为空
local touchX = touch:getLocation().x
local touchY = touch:getLocation().y
local item_i, modX, modY = self:get_the_item_touched(touchX,touchY)
ccprint("item_i " .. touchX .. '
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
