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


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部