Cocos2d-x CCTableView實現列表

在ios程序設計中,會大量使用到tableview視圖(UITableView),那麼在cocos2d-x中,如果需要類似的列表,該如何實現呢?在引擎中參照ios中的UITableView實現了一個叫做CCTableView的類,用於創建列表,對於熟悉ios程序設計的人來說,這個內容應該是很好理解的。

下面這篇博客就介紹一下是如何使用這個CCTableView的吧!

這個文件是在extensions這個文件夾中的:

SouthEast


下面通過一個demo詳細介紹一下。

1、使用的時候要注意要引入擴展庫文件: #include"cocos-ext.h"  

並且最好要添加:  USING_NS_CC_EXT;  這樣就不用老是加前綴cocos2d::extension

  1. #define USING_NS_CC_EXT                     using namespace cocos2d::extension

#define USING_NS_CC_EXT                     using namespace cocos2d::extension

 


2、要繼承CCTableView的兩個代理 CCTableViewDelegate  和  CCTableViewDataSource

所以首先要繼承這裏兩個代理:

 

 

  1. class HelloWorld : public cocos2d::CCLayer,public cocos2d::extension::CCTableViewDelegate,public cocos2d::extension::CCTableViewDataSource  

class HelloWorld : public cocos2d::CCLayer,public cocos2d::extension::CCTableViewDelegate,public cocos2d::extension::CCTableViewDataSource

 


其中至少要實現以下的代理方法:

 

  1. //觸摸到某個cell的事件

  2. virtualvoid tableCellTouched(cocos2d::extension::CCTableView* table, cocos2d::extension::CCTableViewCell* cell);  

  3. //定製每個cell的size

  4. virtual cocos2d::CCSize tableCellSizeForIndex(cocos2d::extension::CCTableView *table, unsigned int idx);  

  5. //定製每個cell的內容

  6. virtual cocos2d::extension::CCTableViewCell* tableCellAtIndex(cocos2d::extension::CCTableView *table, unsigned int idx);  

  7. //確定這個tableview的cell行數

  8. virtual unsigned int numberOfCellsInTableView(cocos2d::extension::CCTableView *table);  

//觸摸到某個cell的事件
    virtual void tableCellTouched(cocos2d::extension::CCTableView* table, cocos2d::extension::CCTableViewCell* cell);
    
    //定製每個cell的size
    virtual cocos2d::CCSize tableCellSizeForIndex(cocos2d::extension::CCTableView *table, unsigned int idx);
    
    //定製每個cell的內容
    virtual cocos2d::extension::CCTableViewCell* tableCellAtIndex(cocos2d::extension::CCTableView *table, unsigned int idx);
    
    //確定這個tableview的cell行數
    virtual unsigned int numberOfCellsInTableView(cocos2d::extension::CCTableView *table);

可以選擇實現: 

 

 

  1. //設置單元格高亮的狀態

  2. virtualvoid tableCellHighlight(CCTableView* table, CCTableViewCell* cell);  

  3. //設置單元格非高亮的狀態

  4. virtualvoid tableCellUnhighlight(CCTableView* table, CCTableViewCell* cell);  

 //設置單元格高亮的狀態
    virtual void tableCellHighlight(CCTableView* table, CCTableViewCell* cell);
    //設置單元格非高亮的狀態
    virtual void tableCellUnhighlight(CCTableView* table, CCTableViewCell* cell);

 3、有於CCTableView是繼承 CCScrollView ,所以必須要繼承這兩個方法,但是什麼都不做,只是空實現而已。 

 

 

  1. //由於CCTableView是繼承CCScrollView,所以要繼承這兩個方法

  2. virtualvoid scrollViewDidScroll(cocos2d::extension::CCScrollView* view) {}  

  3. virtualvoid scrollViewDidZoom(cocos2d::extension::CCScrollView* view) {}  

//由於CCTableView是繼承CCScrollView,所以要繼承這兩個方法
    virtual void scrollViewDidScroll(cocos2d::extension::CCScrollView* view) {}
    virtual void scrollViewDidZoom(cocos2d::extension::CCScrollView* view) {}

 4、按照需要實現代理方法。 

 

首先看看我定製的tableview吧!

SouthEast

其中每一個cell包含的內容:一個背景sprite(藍色),左邊一個label,中間一個menu。


(1)觸摸到某個cell的事件處理:

 

  1. void HelloWorld::tableCellTouched(cocos2d::extension::CCTableView *table, cocos2d::extension::CCTableViewCell *cell)  

  2. {  

  3.     CCLOG("you touch cell index = %u",cell->getIdx());  

  4. }  

void HelloWorld::tableCellTouched(cocos2d::extension::CCTableView *table, cocos2d::extension::CCTableViewCell *cell)
{
    CCLOG("you touch cell index = %u",cell->getIdx());
}

(2)定製每一個cell的size 

 

 

 

  1. CCSize HelloWorld::tableCellSizeForIndex(cocos2d::extension::CCTableView *table, unsigned int idx)  

  2. {  

  3. return CCSizeMake(337, 55);  

  4. }  

CCSize HelloWorld::tableCellSizeForIndex(cocos2d::extension::CCTableView *table, unsigned int idx)
{
    return CCSizeMake(337, 55);
}

(3)定製一個tableview的cell的個數 

 

 

  1. unsigned int HelloWorld::numberOfCellsInTableView(cocos2d::extension::CCTableView *table)  

  2. {  

  3. return 10;  

  4. }  

unsigned int HelloWorld::numberOfCellsInTableView(cocos2d::extension::CCTableView *table)
{
    return 10;
}

(4)定製每一個cell的內容 

 

 

  1. CCTableViewCell* HelloWorld::tableCellAtIndex(cocos2d::extension::CCTableView *table, unsigned int idx)  

  2. {  

  3.     CCString *string = CCString::createWithFormat("index = %d",idx);  

  4.     CCTableViewCell *cell = table->dequeueCell();  

  5. if (!cell) {  

  6.         cell = new CustomTableCell();  

  7.         cell->autorelease();  

  8. //添加背景圖片

  9.         CCSprite *sprite = CCSprite::create("22.png");  

  10.         sprite->setAnchorPoint(CCPointZero);  

  11.         sprite->setPosition(ccp(0, 0));  

  12.         cell->addChild(sprite,1);  

  13. //添加label

  14.         CCLabelTTF *label = CCLabelTTF::create(string->getCString(), "Arial", 15);  

  15.         label->setAnchorPoint(CCPointZero);  

  16.         label->setTag(123);  

  17.         label->cocos2d::CCNode::setPosition(5, 5);  

  18.         cell->addChild(label,2);  

  19. //添加menu

  20.         CCMenuItemImage *itemImage = CCMenuItemImage::create("23.png""24.png", cell, menu_selector(HelloWorld::menuCallBack));  

  21.         CCMenu *menu = CCMenu::create(itemImage,NULL);  

  22. //注意CCMenu是無法修改錨點的,其默認位置是在其幾何中心

  23.         menu->setPosition(ccp(180,26));  

  24. //可以通過修改CCMenuItemImage的錨點的位置

  25. //        itemImage->setAnchorPoint(CCPointZero);

  26. //        menu->setPosition(ccp(180,6));

  27.         cell->addChild(menu, 2);  

  28.     }  

  29. else

  30.     {  

  31. //由於每一個cell的label都是不同的,所以我們通過tag值獲取到label來對label進行修改

  32.         CCLabelTTF *label = (CCLabelTTF*)cell->getChildByTag(123);  

  33.         label->setString(string->getCString());  

  34.     }  

  35. return cell;  

  36. }  

  37. void HelloWorld::menuCallBack(cocos2d::CCObject *pSender)  

  38. {  

  39.     CCTableViewCell *cell = (CCTableViewCell*)(((CCMenuItemImage*)pSender)->getParent()->getParent());  

  40.     CCLog("menu click cell index : %d",cell->getIdx());  

  41. }  

CCTableViewCell* HelloWorld::tableCellAtIndex(cocos2d::extension::CCTableView *table, unsigned int idx)
{
    CCString *string = CCString::createWithFormat("index = %d",idx);
    CCTableViewCell *cell = table->dequeueCell();
    if (!cell) {
        cell = new CustomTableCell();
        cell->autorelease();
        
        //添加背景圖片
        CCSprite *sprite = CCSprite::create("22.png");
        sprite->setAnchorPoint(CCPointZero);
        sprite->setPosition(ccp(0, 0));
        cell->addChild(sprite,1);
        
        //添加label
        CCLabelTTF *label = CCLabelTTF::create(string->getCString(), "Arial", 15);
        label->setAnchorPoint(CCPointZero);
        label->setTag(123);
        label->cocos2d::CCNode::setPosition(5, 5);
        cell->addChild(label,2);
        
        //添加menu
        CCMenuItemImage *itemImage = CCMenuItemImage::create("23.png", "24.png", cell, menu_selector(HelloWorld::menuCallBack));
        CCMenu *menu = CCMenu::create(itemImage,NULL);
        
        //注意CCMenu是無法修改錨點的,其默認位置是在其幾何中心
        menu->setPosition(ccp(180,26));
        
    //可以通過修改CCMenuItemImage的錨點的位置
    //        itemImage->setAnchorPoint(CCPointZero);
    //        menu->setPosition(ccp(180,6));
        
        cell->addChild(menu, 2);
    }
    
    else
    {
        //由於每一個cell的label都是不同的,所以我們通過tag值獲取到label來對label進行修改
        CCLabelTTF *label = (CCLabelTTF*)cell->getChildByTag(123);
        label->setString(string->getCString());
    }

    return cell;
}

void HelloWorld::menuCallBack(cocos2d::CCObject *pSender)
{
    CCTableViewCell *cell = (CCTableViewCell*)(((CCMenuItemImage*)pSender)->getParent()->getParent());
    CCLog("menu click cell index : %d",cell->getIdx());
}

這一部分是最重要的部分,稍微解說一下吧! 

 

①這裏tableview也是用到了ios中cell的重用機制:CCTableViewCell *cell = table->dequeueCell(); 當然這也導致了下面的一些問題:每一個cell 的 label 中的內容都是不一樣的,所以要對label進行一些處理。

②添加menu,我們可能要在menu點擊的時候獲取所在cell的一些消息,這裏也要注意是如何處理的:是通過兩次getParent獲取到cell。

③還有在添加menu的時候意外發現一個問題: 

CCMenu是無法修改錨點值的,其錨點值是在其幾何位置的中心。但是我們可以修改其子項的錨點值。

④由於Menu的觸摸響應優先級是最高的,所以點擊menu的時候是不會觸發 cell 的 touch 事件的。

⑤在向cell添加內容的時候要注意zOrder,否則有可能被其他元素覆蓋了。

⑥其中的tableview cell是可以定製的,代碼中用到的  CustomTableCell 內容如下:

 

  1. #ifndef __TableView__CustonTabelCell__

  2. #define __TableView__CustonTabelCell__

  3. #include <iostream>

  4. #include "cocos-ext.h"

  5. #include "cocos2d.h"

  6. USING_NS_CC;  

  7. USING_NS_CC_EXT;  

  8. class CustomTableCell:public cocos2d::extension::CCTableViewCell  

  9. {  

  10. public:  

  11. void draw();  

  12. };  

  13. #endif /* defined(__TableView__CustonTabelCell__) */

#ifndef __TableView__CustonTabelCell__
#define __TableView__CustonTabelCell__

#include <iostream>
#include "cocos-ext.h"
#include "cocos2d.h"

USING_NS_CC;
USING_NS_CC_EXT;

class CustomTableCell:public cocos2d::extension::CCTableViewCell
{
public:
    void draw();
};

#endif /* defined(__TableView__CustonTabelCell__) */

  1. #include "CustonTabelCell.h"

  2. void CustomTableCell::draw()  

  3. {  

  4.     CCTableViewCell::draw();  

  5. }  

#include "CustonTabelCell.h"

void CustomTableCell::draw()
{
    CCTableViewCell::draw();
}

其中是沒有添加定製實現的。 

 


5、設置cell被點擊時高亮和非高亮。

 

  1. void HelloWorld::tableCellHighlight(cocos2d::extension::CCTableView *table, cocos2d::extension::CCTableViewCell *cell)  

  2. {  

  3.     CCLog("High light");  

  4.     CCSprite *sprite1 = CCSprite::create("21.png");  

  5.     sprite1->setTag(21);  

  6.     sprite1->setOpacity(125); //設置透明度

  7.     sprite1->setAnchorPoint(CCPointZero);  

  8.     sprite1->setPosition(ccp(0, 0));  

  9.     cell->addChild(sprite1,3);  

  10. }  

  11. void HelloWorld::tableCellUnhighlight(cocos2d::extension::CCTableView *table, cocos2d::extension::CCTableViewCell *cell)  

  12. {  

  13.     CCLog("Unhigh light");  

  14.     cell->removeChildByTag(21);  

  15. }  

void HelloWorld::tableCellHighlight(cocos2d::extension::CCTableView *table, cocos2d::extension::CCTableViewCell *cell)
{
    CCLog("High light");
    CCSprite *sprite1 = CCSprite::create("21.png");
    sprite1->setTag(21);
    sprite1->setOpacity(125); //設置透明度
    sprite1->setAnchorPoint(CCPointZero);
    sprite1->setPosition(ccp(0, 0));
    cell->addChild(sprite1,3);

}
void HelloWorld::tableCellUnhighlight(cocos2d::extension::CCTableView *table, cocos2d::extension::CCTableViewCell *cell)
{
    CCLog("Unhigh light");
    cell->removeChildByTag(21);
}

SouthEast


6、下面就是如何創建tablview了,在init方法中:

 

  1. bool HelloWorld::init()  

  2. {  

  3. //////////////////////////////

  4. // 1. super init first

  5. if ( !CCLayer::init() )  

  6.     {  

  7. returnfalse;  

  8.     }  

  9.     CCTableView *tableview = CCTableView::create(this, CCSizeMake(436, 300));  

  10.     tableview->setDirection(kCCScrollViewDirectionVertical); //設置tableview的方向是豎直方向,當然也有水平方向

  11.     tableview->setDelegate(this);  

  12.     tableview->setVerticalFillOrder(kCCTableViewFillTopDown);// 設置tableview cell的index排列,這裏設置是從上到下變大,當然也可以從下到上變大。

  13.     tableview->setPosition(ccp(20,20));  

  14. this->addChild(tableview);  

  15. //    tableview->reloadData();

  16. returntrue;  

  17. }  

bool HelloWorld::init()
{
    //////////////////////////////
    // 1. super init first
    if ( !CCLayer::init() )
    {
        return false;
    }
    
    
    CCTableView *tableview = CCTableView::create(this, CCSizeMake(436, 300));
    tableview->setDirection(kCCScrollViewDirectionVertical); //設置tableview的方向是豎直方向,當然也有水平方向
    tableview->setDelegate(this);
    tableview->setVerticalFillOrder(kCCTableViewFillTopDown);// 設置tableview cell的index排列,這裏設置是從上到下變大,當然也可以從下到上變大。
    tableview->setPosition(ccp(20,20));
    this->addChild(tableview);
    
//    tableview->reloadData();

    return true;
}


 

好啦,大概tableview常用的一些操作就是這些了,當然CCTabelView中還有一些其他方法,這些都是和ios中的差不多的,需要的時候查看就可以了。

 

轉載自:http://blog.csdn.net/crayondeng/article/details/11649977

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章