排行榜 曾经的牛逼写法

-----------------------------------------------------
-- Module Charts
-- Dialog视图模板
-----------------------------------------------------
module( "Charts",package.seeall )
setmetatable(Charts,{__index = dialog_t})


---------------------------实例变量--------------------------
local instance = nil
local NUM_PER_PAGE_0 = 10 --初始化时加载的个数
local ITEM_NUM = 28 -- 4 * 7 = 28 区间定为 28 ,同时最多 28 个(待定) ITEM , 初始加载 10 个,然后加至 28 ,保持不变
local ITEM_NUM_4 = 7 -- 分了四部分
local LOAD_INTERVAL = 0.1 -- 加载一个新的item的时间间隔
local MARGIN = 0
local sharedScheduler = cc.Director:getInstance():getScheduler() --cc.Director:getInstance():getScheduler():scheduleScriptFunc


----------------------------实例的创建与销毁-------------------------
function getInstance()
    instance = instance or new()
    return instance
end


function destroyInstance()
    if instance then
        instance:dispose()
        instance = nil
    end
end


-----------------------------------------------------
function new()
    local this = {}
    setmetatable(this,{__index = Charts})
    this:init()
    return this
end


------------------------------实例的UI初始化-----------------------
function init(self)
    dialog_t.init(self)


    self._name = "Charts"
    self._layout = Global.getInstance():loadUI("", self._name)


    self._core:addChild(self._layout)


    self:initRegister()
end


-------------------------------实例UI对象的初始化与绑定----------------------
function controlRegister(self)
    --    self.xxxx = Global.getInstance():getUINodeLoopByName(self._layout, "xxxx")
    --
    --    self.xxxx_list = Global.getInstance():getUINodeLoopByName(self._layout, "xxxx_list")
    --    self.xxxx_list:setBounceEnabled(true)
    --    self.xxxx_list:setItemsMargin(4.0)
    --    self.xxxx_list:setItemModel(Global.getInstance():loadUI("", "xxxx_item"))
    --
    --    Global.getInstance():UIEventRegister("ended", self._name, self.xxxx, "btnxxxx")
    self.lsv_main = Global.getInstance():getUINodeLoopByName(self._layout, "ListView_2")
    local itemUI = Global.getInstance():loadUI("", "ChartsCell")
    --self.item = Global.getInstance():getUINodeLoopByName(itemUI, "Panel_1")
    --self.item:retain()
    --self.lsv_main:setItemModel(self.item)
    self.inner = self.lsv_main:getInnerContainer()
    self.lsv_main:setItemsMargin(MARGIN)
    self.btn_1 = Global.getInstance():getUINodeLoopByName(self._layout, "Button_9") --三个subType
    self.btn_2 = Global.getInstance():getUINodeLoopByName(self._layout, "Button_9_0")
    self.btn_3 = Global.getInstance():getUINodeLoopByName(self._layout, "Button_9_0_0")
    self.btn_back = Global.getInstance():getUINodeLoopByName(self._layout, "Button_4")


    Global.getInstance():UIEventRegister("ended", self._name, self.btn_1, "Btn_subType",nil, 1)
    Global.getInstance():UIEventRegister("ended", self._name, self.btn_2, "Btn_subType",nil, 2)
    Global.getInstance():UIEventRegister("ended", self._name, self.btn_3, "Btn_subType",nil, 3)
    Global.getInstance():UIEventRegister("ended", self._name, self.btn_back, "Btn_back")


    self.lsv_main:addScrollViewEventListener(ListScrollViewEvent)
    local function load0()
        self:load_next_items_to_tail_0(1)
    end
    local function load1()
        self:load_next_items_to_head(1)
    end
    local function load2()
        self:load_next_items_to_tail(1)
    end
    local function onTouchBegan(touch, event)
        self.delY = 0
        return true
    end
    local function onTouchMoved(touch, event)
        self.delY = touch:getLocation().y - touch:getPreviousLocation().y
        if not self.PHASE_0_END then    --加载一个item时,弹性消失一瞬间
            if self.delY < 0 then
                if self.handle0 ~= nil then
                    self:unscheduleGlobal('handle0', 'NotNil')
                end
        else
            if self.handle0 == nil then
                self.handle0 = self:scheduleGlobalWithTime(load0, LOAD_INTERVAL, ITEM_NUM - (self.iTail - self.iHead + 1), 'handle0') -- times <= 0 也会执行一次
            end
        end
        end
    end
    local function onTouchEnded(touch, event) --加载新item时,弹性消失
        if self.PHASE_0_END then
            local yInner = self.inner:getPositionY() --lsv_main 和世界坐标系是平移关系
            local yHead = self.lsv_main:getItem(0):getPositionY() + yInner 
            local yTail = self.lsv_main:getItem(self.iTail - self.iHead):getPositionY() + yInner
            local yScv = self.lsv_main:getPositionY()
            local y = touch:getLocation().y 
            y = y - yScv    -- 比较  yHead - y  , y - yTail


            if y - yTail < yHead - y then   -- 在下部
                if self.delY > 0 then    --往下走
                    if self.handle1 ~= nil then     --这两个判断顺序不能变,见 self:unschedule
                        self:unscheduleGlobal('handle1')
                end
                if self.handle2 == nil then --简单起见可以不考虑加载到头的情形
                    self.handle2 = self:scheduleGlobalWithTime(load2, LOAD_INTERVAL, ITEM_NUM_4, 'handle2')
                end
            end
            else     --在上部
                if self.delY < 0 then       --往上走
                    if self.handle2 ~= nil then
                        self:unscheduleGlobal('handle2')
                end
                if self.handle1 == nil then 
                    self.handle1 = self:scheduleGlobalWithTime(load1, LOAD_INTERVAL, ITEM_NUM_4, 'handle1')
                end
            end
            end
    end
    end


    self.listener1 = cc.EventListenerTouchOneByOne:create()
    self.listener1:registerScriptHandler(onTouchBegan,cc.Handler.EVENT_TOUCH_BEGAN )
    self.listener1:registerScriptHandler(onTouchMoved,cc.Handler.EVENT_TOUCH_MOVED )
    self.listener1:registerScriptHandler(onTouchEnded,cc.Handler.EVENT_TOUCH_ENDED )
    cc.Director:getInstance():getEventDispatcher():addEventListenerWithFixedPriority(self.listener1, -1)
end


----------------------------消息注册-------------------------
function messageRegister(self)
-- self.listener1 = Global.getInstance():UIMessageRegister("xxxx", self._name)
end


-----------------------------消息清除------------------------
function messageUnRegister(self)
-- Global.getInstance():UIMessageUnRegister(self.listener1)
end


------------------------------消息触发回调-----------------------
function onMessage(self, name, data)
    if "xxxx" == name then


    elseif "" == name then


    end
end


---------------------------通知注册--------------------------
function noticeRegister(self)
-- self.notice = Global.getInstance():UINoticeRegister("xxxx", self._name)
end


----------------------------通知清除-------------------------
function noticeUnRegister(self)
-- Global.getInstance():UINoticeUnRegister(self.notice)
end


-----------------------------通知触发回调------------------------
function onNotice(self, name, data)
    if "xxxx" == name then


    elseif "" == name then


    end
end


-----------------------------初始化------------------------
function initRegister(self)
    self:controlRegister()
    self:messageRegister()
    self:noticeRegister()
end


function releaseRegister( self )
    self:messageUnRegister()
    self:noticeUnRegister()
end


-----------------------------场景开始载入回调------------------------
function onEnter(self)
    print(self._name .. " => " .. "onEnter")
    self.subType = 1 --默认
    self:set_item_model()
    self:Init()
end






------------------------------场景清除回调-----------------------
function onExit(self)
    print(self._name .. " => " .. "onExit")
    self:doClear()
    --self.item:release()
    if self.listener1 ~= nil then --有内置的self.listener!
        cc.Director:getInstance():getEventDispatcher():removeEventListener(self.listener1)
        self.listener1 = nil
    end
end


function doClear(self)
    if self.handle0 ~= nil then
        self:unscheduleGlobal('handle0')
    end
    if self.handle1 ~= nil then
        self:unscheduleGlobal('handle1')
    end
    if self.handle2 ~= nil then
        self:unscheduleGlobal('handle2')
    end
    if self.handle_can_load ~= nil then --有限次计时器也要释放,否则关闭页面后会出问题(self = nil)
        self:unscheduleGlobal('handle_can_load')
    end
    if self.handle_inner_pos ~= nil then 
        self:unscheduleGlobal('handle_inner_pos')
    end
end


-------------------------------实例销毁----------------------
function dispose(self)
    self:releaseRegister()
    if self._core then
        self._core:removeFromParent(true)
        self._core = nil
    end
    dialog_t.dispose(self)
end


--------------------------------UI刷新---------------------
function refreshUI(self)


end
function refreshData(self)


end
----------------------------响应-------------------------
function btnXXXX(self, sender, param)


end


function Btn_back(self, sender, param)
    Dialogs.getInstance():closeDialog(self._name)
end


function Btn_subType(self, sender, param)
    self:doClear()
    self.subType = param
    self:Init()
end


function ListScrollViewEvent(sender, evenType)
    local self = getInstance()
    local function set_can_load()
        self.can_load = true
        self.inner:setPosition(self.x_record, self.y_record)
    end
    --    local function set_inner_pos() -- 分开写在倒着滑时竟然出问题。。。
    --        self.inner:setPosition(self.x_record, self.y_record)
    --    end
    if evenType == ccui.ScrollviewEventType.scrollToBottom then
        print("BOTTOM")
        if self.iTail ~= #self.data and self.can_load then
            self.can_load = false
            self.lsv_main:jumpToBottom()
            --self.handle_inner_pos = Scheduler.performWithDelayGlobal(set_inner_pos, 0)
            self.handle_can_load = Scheduler.performWithDelayGlobal(set_can_load, 0) --require scheduler在main里
            self:load_next_items_to_tail(ITEM_NUM_4)
        end
    elseif evenType ==  ccui.ScrollviewEventType.scrollToTop then 
        print("TOP" )
        if self.iHead ~= 1 and self.can_load then
            self.can_load = false
            self.lsv_main:jumpToTop()
            self.handle_can_load = Scheduler.performWithDelayGlobal(set_can_load, 0) 
            self:load_next_items_to_head(ITEM_NUM_4)
        end
    end
end


----------------------------custom-----------------------------


function Init(self )
    self.data ={}
    for i = 1, 100 do
        self.data[i] = i 
    end 
    self.can_load =true
    self.iHead = 1
    self.iTail = 0
    self.PHASE_0_END = false --第0阶段结束后再激活其他handle
    self.lsv_main:removeAllItems()
    self.lsv_main:jumpToTop()
    self:set_item_model()
    local function load0()
        self:load_next_items_to_tail_0(1)
    end
    self.handle0 = self:scheduleGlobalWithTime(load0, LOAD_INTERVAL, ITEM_NUM - NUM_PER_PAGE_0,'handle0')
    self:load_next_items_to_tail(NUM_PER_PAGE_0)
end


function set_an_item(self, item, i)
    Global.getInstance():getUINodeLoopByName(item, "BitmapFontLabel_3"):setString(tostring(self.data[i]))
end


function load_next_items_to_head(self, num) --同时从tail删除
    local start = self.iHead - 1
    local bound = math.max(1, self.iHead - num)
    self.iHead = bound
    local inner_delY = 0
    for i = start, bound, -1 do
        self.lsv_main:insertDefaultItem(0)
        local item = self.lsv_main:getItem(0)
        self:set_an_item(item, i)
        if self.iTail - i + 1 > ITEM_NUM then -- 保持总数在 ITEM_NUM 个
            self.lsv_main:removeItem(self.iTail - i)
            inner_delY = inner_delY + (self.item_height + MARGIN)
            self.iTail = self.iTail - 1
        end
    end
    local y = self.inner:getPositionY() 
    self.inner:setPosition(0, y + inner_delY)
    self.x_record, self.y_record = self.inner:getPosition()
    print('head ' .. self.iHead .. ' ' .. self.iTail .. ' ' .. self.iTail - self.iHead + 1)
end 


function load_next_items_to_tail_0(self, num) -- 这里num只传 1
    if self.iTail - self.iHead + 1 == ITEM_NUM or self.iTail - self.iHead + 1 == #self.data then
        if self.handle0 ~= nil then
            self:unscheduleGlobal('handle0') --需要尽快执行 handle2
        end
        return
end
local start = self.iTail + 1
local bound = math.min(#self.data, self.iTail + num)
self.iTail = bound
for i = start, bound do
    print("tail0  " .. i)
    self.lsv_main:pushBackDefaultItem()
    local item = self.lsv_main:getItem(i - self.iHead)
    self:set_an_item(item, i)
end
end


function load_next_items_to_tail(self, num) --同时从head删除
    local start = self.iTail + 1
    local bound = math.min(#self.data, self.iTail + num)
    self.iTail = bound
    local inner_delY = 0
    for i = start, bound do
        self.lsv_main:pushBackDefaultItem()
        local item = self.lsv_main:getItem(i - self.iHead)
        inner_delY = inner_delY - (self.item_height + MARGIN)
        self:set_an_item(item, i)
        if i - self.iHead + 1 > ITEM_NUM then --保持总数在 ITEM_NUM 个
            self.lsv_main:removeItem(0)
            self.iHead = self.iHead + 1
            --inner_delY = inner_delY + (self.item_height + MARGIN)
        end
    end
    local y = self.inner:getPositionY() 
    self.inner:setPosition(0, y + inner_delY)
    self.x_record, self.y_record = self.inner:getPosition()
    print('tail ' .. self.iHead .. ' ' .. self.iTail .. ' ' .. self.iTail - self.iHead + 1)
end


function set_item_model(self)
    --以下注释方法并不能显示item
    --    for i = 1,3 do
    --        if self.subType == i then
    --            Global.getInstance():getUINodeLoopByName(self.item, "Cell" .. i):setVisible(true)
    --        else
    --            Global.getInstance():getUINodeLoopByName(self.item, "Cell" .. i):setVisible(false)
    --        end
    --    end
    local itemUI = Global.getInstance():loadUI("", "ChartsCell" .. self.subType)
    local item = Global.getInstance():getUINodeLoopByName(itemUI, 'Panel_1')
    self.item_width = item:getContentSize().width
    self.item_height = item:getContentSize().height
    self.lsv_main:setItemModel(item) -- 该函数中把item retain 了,但是一般只有手动 retain()的东西才用手动 release().
end


-----------------------借用scheduler.lua代码并修改-----------------------


function unscheduleGlobal(self, name, p) -- self[name] is the handle
    sharedScheduler:unscheduleScriptEntry(self[name])
    self[name] = nil
    if p == nil then
        self.PHASE_0_END = true
    end
end


-- 有限次数的倒计时, time = 次数
function scheduleGlobalWithTime(self, listener, interval, times, name) -- times <= 0 也会执行一次 , name is string
    local handle
    local i = times
    handle = sharedScheduler:scheduleScriptFunc(function()
        i = i - 1
        listener(i)
        if(i <= 0)then
            self:unscheduleGlobal(name)
        end
    end, interval, false)
    return handle
end


--仅执行一次
function performWithDelayGlobal(self, listener, time, name) -- self[name] is the handle
    local handle
    handle = sharedScheduler:scheduleScriptFunc(function()
        self:unscheduleGlobal(name)
        listener()
    end, time, false)
    return handle
end
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值