(原創)cocos2dx-lua TableView官方demo分析


本來是想看看網上的教程文章,結果看了好幾篇,復制代碼各種報錯,有很多不存在的類和變量,根本用不了。

所以干脆自己去看官方demo,經過自己分析測試,已經大概會用了,順便記錄一下。

以下是代碼,復制粘貼就能運行的那種!(圖片資源自備)

 

新建  tableviewTest.lua,把下面的代碼復制進去,保存為utf8格式。在需要的地方(比如main()函數里)調用 require("tableviewTest")

local TableViewTestLayer = class("TableViewTestLayer")
TableViewTestLayer.__index = TableViewTestLayer

--這里是為了讓layer能調用TableViewTestLayer的方法
function TableViewTestLayer.extend(target)
    local t = tolua.getpeer(target)
    if not t then
        t = {}
        tolua.setpeer(target, t)
    end
    setmetatable(t, TableViewTestLayer)
    return target
end

--滾動事件
function TableViewTestLayer.scrollViewDidScroll(view)
    --print("滾動事件")
end

function TableViewTestLayer.scrollViewDidZoom(view)
    print("scrollViewDidZoom")
end

--cell點擊事件
function TableViewTestLayer.tableCellTouched(table,cell)
    print("點擊了cell:" .. cell:getIdx())
end

--cell的大小,注冊事件就能直接影響界面,不需要主動調用
function TableViewTestLayer.cellSizeForTable(table,idx) 
    return 150,150
end

--顯示出可視部分的界面,出了裁剪區域的cell就會被復用
function TableViewTestLayer.tableCellAtIndex(table, idx)
    local strValue = string.format("%d",idx)
    print("數據加載"..strValue)
    local cell = table:dequeueCell()
    local label = nil
    if nil == cell then
        print("創建了新的cell")
        cell = cc.TableViewCell:new()

        --添加cell內容
        local sprite = cc.Sprite:create("res/tablecell.png")
        sprite:setAnchorPoint(cc.p(0,0))
        sprite:setPosition(cc.p(0, 0))
        cell:addChild(sprite)

        label = cc.Label:createWithSystemFont(strValue, "Helvetica", 40)
        label:setPosition(cc.p(0,0))
        label:setAnchorPoint(cc.p(0,0))
        label:setColor(cc.c3b(255,0,0))
        label:setTag(123)
        cell:addChild(label)
    else
        print("使用已經創建過的cell")
        label = cell:getChildByTag(123)
        if nil ~= label then
            label:setString(strValue)
        end
    end

    return cell
end

--設置cell個數,注冊就能生效,不用主動調用
function TableViewTestLayer.numberOfCellsInTableView(table)
   return 100
end

function TableViewTestLayer:init()

    local winSize = cc.Director:getInstance():getWinSize()

    --創建TableView
    local tableView = cc.TableView:create(cc.size(600,200))
    --設置滾動方向  水平滾動
    tableView:setDirection(cc.SCROLLVIEW_DIRECTION_HORIZONTAL)
    tableView:setPosition(cc.p(20, winSize.height / 2 - 150))
    tableView:setDelegate()
    self:addChild(tableView)
    --registerScriptHandler functions must be before the reloadData funtion
    --注冊腳本編寫器函數必須在reloadData函數之前(有道自動翻譯)

    --cell個數
    tableView:registerScriptHandler(TableViewTestLayer.numberOfCellsInTableView,cc.NUMBER_OF_CELLS_IN_TABLEVIEW)  
    --滾動事件
    tableView:registerScriptHandler(TableViewTestLayer.scrollViewDidScroll,cc.SCROLLVIEW_SCRIPT_SCROLL)
    tableView:registerScriptHandler(TableViewTestLayer.scrollViewDidZoom,cc.SCROLLVIEW_SCRIPT_ZOOM)
    --cell點擊事件
    tableView:registerScriptHandler(TableViewTestLayer.tableCellTouched,cc.TABLECELL_TOUCHED)
    --cell尺寸、大小
    tableView:registerScriptHandler(TableViewTestLayer.cellSizeForTable,cc.TABLECELL_SIZE_FOR_INDEX)
    --顯示出可視部分的cell
    tableView:registerScriptHandler(TableViewTestLayer.tableCellAtIndex,cc.TABLECELL_SIZE_AT_INDEX)
    --調用這個才會顯示界面
    tableView:reloadData()


    -----------------------------------------------------------
    --跟上面差不多,這里是創建一個“垂直滾動”的TableView
    tableView = cc.TableView:create(cc.size(200, 350))
    tableView:setDirection(cc.SCROLLVIEW_DIRECTION_VERTICAL)
    tableView:setPosition(cc.p(winSize.width - 150, winSize.height / 2 - 150))
    tableView:setDelegate()
    tableView:setVerticalFillOrder(cc.TABLEVIEW_FILL_TOPDOWN)
    self:addChild(tableView)
    tableView:registerScriptHandler(TableViewTestLayer.scrollViewDidScroll,cc.SCROLLVIEW_SCRIPT_SCROLL)
    tableView:registerScriptHandler(TableViewTestLayer.scrollViewDidZoom,cc.SCROLLVIEW_SCRIPT_ZOOM)
    tableView:registerScriptHandler(TableViewTestLayer.tableCellTouched,cc.TABLECELL_TOUCHED)
    tableView:registerScriptHandler(TableViewTestLayer.cellSizeForTable,cc.TABLECELL_SIZE_FOR_INDEX)
    tableView:registerScriptHandler(TableViewTestLayer.tableCellAtIndex,cc.TABLECELL_SIZE_AT_INDEX)
    tableView:registerScriptHandler(TableViewTestLayer.numberOfCellsInTableView,cc.NUMBER_OF_CELLS_IN_TABLEVIEW)
    tableView:reloadData()
    
    

    return true
end

--這里是為了讓layer能調用TableViewTestLayer的方法
function TableViewTestLayer.create()
    local layer = TableViewTestLayer.extend(cc.Layer:create())
    if nil ~= layer then
        layer:init()
    end

    return layer
end

--運行測試場景
function runTableViewTest()
    local newScene = cc.Scene:create()
    local newLayer = TableViewTestLayer.create()
    newScene:addChild(newLayer)
    cc.Director:getInstance():replaceScene(newScene)
    --return newScene
end

runTableViewTest()

return TableViewTestLayer

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM