cocos2d-x lua 自定义TableView


效果



    实现一个自定义的TableLayer,该Layer具有以下特性

   1. 该TableLayer可以在create的时候可以设置表格的行数和列数

   2. 该TableLayer具有一个addCell方法可以添加CCNode对象到表格

   3. 该TableLayer可以自动对表格中的CCNode对象进行排列


   假设行数为3,列数为3时,通过TableLayer的addCell方法添加12个宽和高相同的CCNode对象,它们的添加顺序和位置如下图所示:

   


    可以看出表格可以不断向右扩展,而且单元格自动排序,如果把该TableLayer添加到CCScrollView的container中,就可以实现一个可滑动的自定义TableView了。



实现思路


  1. TableLayer继承CCLayer

  2. TableLayer通过构造函数传入表格列数、行数、单元格宽、高

  3. TableLayer提供了一个addCell方法添加单元格(CCNode对象)

  4. addCell方法先调用nextCell方法获取单元格的坐标(由单元格的列数和行数组成),然后调用positionByColumnAndRow方法根据单元格坐标获取该单元格的位置,最后      调用CCNode的setPosition方法设置位置并添加到TableLayer中。


   如何知道单元格的位置?

   1.首先需要知道单元格的所在的列和行,通过nextCell方法获取,具体逻辑下面的代码有说明。 

    2.然后根据单元格的宽、高,表格的高度计算单元格的的x,y坐标。

    第一列为1,第一行为1

    x = 单元格宽度 * (单元格所在列 - 1)+ 单元格宽度 / 2

    y = 表格高度 - (单元格高度 * (单元格所在行 - 1)+  单元格高度 / 2)(注意:cocos2d-x坐标是以左下角为原点,而这里单元格坐标是以左上角为原点)


实现代码


Lua代码:

module("ui_table_layer_t", package.seeall)
-- 继承CCLayer
baseClass(layer_base_t, ui_table_layer_t)

-- 构造函数
function init(self, column, row, cellWidth, cellHeight)
	-- 初始化CCLayer
	layer_base_t.init(self)

	-- 列
	self.column = column
	-- 行
	self.row = row

	self.cellWidth = cellWidth
	self.cellHeight = cellHeight

	-- 下一行
	self.nextColumn = 1
	self.curColumn = 1
	-- 下一列
	self.nextRow = 1

	-- 表格宽高
	self.width = column * cellWidth
	self.height = row * cellHeight

	self.menu = CCMenu:create()
	self.menu:setPosition(CCPointZero)
	self.node_:addChild(self.menu)
end

function getTableView(self)
    if self.scrollView == nil then
        self.scrollView = CCScrollView:create(CCSizeMake(self.column * self.cellWidth, self.row * self.cellHeight), self.node_)
        --设置滚动方向为水平滚动
        self.scrollView:setDirection(kCCScrollViewDirectionHorizontal)
    end
    return self.scrollView
end

function addCell(self, cell)
	cell:setAnchorPoint(ccp(0.5,0.5))
	cell:setPosition(self:nextPosition())
	self.node_:addChild(cell)
	
    self.node_:setContentSize(CCSize(self.curColumn * self.cellWidth, self.height))
end

function addMenuItem(self, item)
	item:setAnchorPoint(ccp(0.5,0.5))
	item:setPosition(self:nextPosition())
	self.menu:addChild(item)
	
    self.node_:setContentSize(CCSize(self.curColumn * self.cellWidth, self.height))
end


-- 单元格坐标计算逻辑
function nextCell(self)
	local column = self.nextColumn
	local row = self.nextRow

	-- 计算下一个单元格的坐标
    if column < self.column then
        self.nextColumn = self.nextColumn + 1
    elseif column == self.column then
        -- 到达指定行,换列
        if row == self.row then
            self.nextColumn = column + 1
            self.nextRow = 1
        else
            -- 未到达指定行,换行
            self.nextColumn = 1
            self.nextRow = row + 1
        end        
    else
        -- 到达指定行,+列
        if row == self.row then
            self.nextColumn = column + 1
            self.nextRow = 1
        else
            self.nextRow = row + 1
        end
    end

    cclog("nextCell column=%d row=%d",column,row)

	self.curColumn = column
	return column,row
end


-- 根据单元格坐标计算出单元格的位置
function positionByColumnAndRow(self, column, row)
	local x = self.cellWidth*(column-1) + self.cellWidth/2
	local y = self.height - self.cellHeight*(row-1) - self.cellHeight/2 -- 需要转换为UI坐标
	-- cclog("positionByColumnAndRow column=%d row=%d x=%f y=%f", column, row, x, y)
	return x,y
end

-- 获取下一个单元格位置
function nextPosition(self)
	return self:positionByColumnAndRow(self:nextCell())
end

-- 获取可偏移范围
function getOffsetRange(self)
	return self.curColumn*self.cellWidth - self.width
end



posted on 2014-08-13 15:09  linchaolong  阅读(1375)  评论(0编辑  收藏  举报

导航