scv.lua 的使用

来源:互联网 发布:怎么避免mac涂层脱落 编辑:程序博客网 时间:2024/06/14 06:13


---------------------------------------------------------------------------------------------------------

----通用cocos lua scroll list view 框架 (version 01)     scv.lua   的说明文档

---------------------------------------------------------------------------------------------------------

感谢我司(北京昊睿中天)成员 柯友运 给我的灵感,写出该库。 外界来的灵感更多也非常重要!


 现在 scv.lua 经过我测试已经可以用了
使用方法:

以排行榜“Charts.lua”为例,Charts是个页面,里面有3个标签页

1. 只能用 ScrollView 。    listView 即是单列的 ScrollView 

2. item 要求:  item是可以用 :clone()克隆的东西,layout ,_layerRGBA 不能克隆, 美术上应该有个能得出     item大小的image,以这个image为总根即可, 获得item后 retain() 一下,离开Charts页面时 release()

3.在 Charts.lua 有个 create() 方法:
function create(self)
    scroll:set_margin(0,0,0)
    scroll:create('Charts', self.scv, self['item' .. self.subType], self.data)
end
每次打开一个标签页就调用一次

4. 在模块中要有个 set_an_item(self, item, i)函数装饰一个item, item对应数据第i项,数据应该能用 # 符号获取长度

5. 在Charts 的 onExit() 中调用scroll.onExit()并将item  release

scroll:onExit()
    for i = 1, 3 do
        self['item' .. i]:release()
        self['item' .. i] = nil
    end


现在 scv.lua 有如下功能:

1. scroll:jump_to(i) 跳至第i行,会得到最佳效果

2. scroll:register_item_touch() ,scroll:unregister_item_touch() 注册和取消item的点击事件,
这个是用范围做的,前提是:相关缩放为 100%, scroll view 的父源点和世界源点重合,在模块中要有个 touch_an_item(self, item, i)方法,item对应数据第i项,仅手指抬起后相应,该方法局限太强,可不用

3.如果数据有变化,刷新调用 self.refresh() 会得到最佳效果.

4.如果希望再次回到某一标签A页面还能到达之前的状态, 可以在模块内建个 local state, 在离开标签A时存储当前的状态 state = scroll:get_current_state() , 无论在游戏的任何时候再回到改标签(即使该标签页中的items个数有变化) 在调用该模块的 self:create 后,接着调用 scroll:set_current_state(state), 那么会得到一个最佳效果







Charts.lua 为例 :


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


---------------------------实例变量--------------------------
local instance = nil


----------------------------实例的创建与销毁-------------------------
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.scv = Global.getInstance():getUINodeLoopByName(self._layout, "ScrollView_1")
        local itemUI = Global.getInstance():loadUI("", "ChartsCell")
--        local itemUI_2 = Global.getInstance():loadUI("", "ChartsCell2")
--        local itemUI_3 = Global.getInstance():loadUI("", "ChartsCell3")
        self.item1 = Global.getInstance():getUINodeLoopByName(itemUI, "Image_5")
         self.item2 = Global.getInstance():getUINodeLoopByName(itemUI, "Image_5_1")
         self.item3 = Global.getInstance():getUINodeLoopByName(itemUI, "Image_5_2")
         self.item1:retain()
         self.item2:retain()
         self.item3:retain()
        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")
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.data = {}
    for i = 1, 100 do
        self.data[i] = i
    end
    self.subType = 1
    self:create()
end


------------------------------场景清除回调-----------------------
function onExit(self)
    print(self._name .. " => " .. "onExit")
    scroll:onExit()
    for i = 1, 3 do
        self['item' .. i]:release()
        self['item' .. i] = nil
    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 create(self)
    scroll:set_margin(0,0,0) -- set_margin()也有默认值,如果不用此函数则为上次的margin值
    scroll:create('Charts', self.scv, self['item' .. self.subType], self.data) -- 后面还有两个参数,不写则用默认值
end


function set_an_item(self, item, i)
    if self.subType == 2 then
        Global.getInstance():getUINodeLoopByName(item, "BitmapFontLabel_3_0"):setString(tostring(self.data[i]))
    else
        Global.getInstance():getUINodeLoopByName(item, "BitmapFontLabel_3"):setString(tostring(self.data[i]))
    end
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.subType = param
    self:create()
end


0 0