您的位置:首页 > 移动开发 > Cocos引擎

cocos2d-x的初步学习十一之CCTableView

2013-06-15 01:39 295 查看
在这篇文章中,我们将讲下CCTableView,顾名思义,CCTableView表试图,在ios里是tableview,android里是listview,都是差不多的意思,在cocos2dx中CCTableView继承自CCScrollview。OK,下面我们直接上代码:

在头文件.h中:

class HelloWorld : public cocos2d::CCLayer,public cocos2d::extension::CCTableViewDelegate,cocos2d::extension::CCTableViewDataSource
{
public:
    // Method 'init' in cocos2d-x returns bool, instead of 'id' in cocos2d-iphone (an object pointer)
    virtual bool init();

    // there's no 'id' in cpp, so we recommend to return the class instance pointer
    static cocos2d::CCScene* scene();
    
    // a selector callback
    void menuCloseCallback(CCObject* pSender);

    // preprocessor macro for "static create()" constructor ( node() deprecated )
    CREATE_FUNC(HelloWorld);
    
    
    
public:
    
    //CCTableViewDelegate继承自CCScrollViewDelegate
    virtual void scrollViewDidScroll(cocos2d::extension::CCScrollView* view);
    
    virtual void scrollViewDidZoom(cocos2d::extension::CCScrollView* view);
    
    //点击哪个cell
    virtual void tableCellTouched(cocos2d::extension::CCTableView* table, cocos2d::extension::CCTableViewCell* cell);
    //每个cell的size
    virtual cocos2d::CCSize cellSizeForTable(cocos2d::extension::CCTableView *table);
    //生成cell
    virtual cocos2d::extension::CCTableViewCell* tableCellAtIndex(cocos2d::extension::CCTableView *table, unsigned int idx);
    //cell的数量
    virtual unsigned int numberOfCellsInTableView(cocos2d::extension::CCTableView *table);
    
    //按下去的时候,就是高亮显示,这里可以设置高亮状态
    virtual void tableCellHighlight(cocos2d::extension::CCTableView* table, cocos2d::extension::CCTableViewCell* cell);
    
    //松开的时候,取消高亮状态
    virtual void tableCellUnhighlight(cocos2d::extension::CCTableView* table, cocos2d::extension::CCTableViewCell* cell);

    
    
    void scrollBar(cocos2d::extension::CCTableView* table);
    
    
};


.cpp中:

bool HelloWorld::init()
{
    //////////////////////////////
    // 1. super init first
    if ( !CCLayer::init() )
    {
        return false;
    }
    
    
    CCSize visibSize=CCDirector::sharedDirector()->getVisibleSize();
    
    CCTableView *tableView=CCTableView::create(this, CCSizeMake(visibSize.width, visibSize.height));
    
    tableView->setDirection(kCCScrollViewDirectionVertical);
    
    tableView->setPosition(CCPointZero);

   // tableView->setAnchorPoint(ccp(0, 0));
    tableView->setDelegate(this);
    
    tableView->setVerticalFillOrder(kCCTableViewFillTopDown);
    
    this->addChild(tableView,1);
    
    tableView->reloadData();
    
    
    return true;
}


回调函数:

unsigned int HelloWorld::numberOfCellsInTableView(CCTableView *table)
{

    return 10;
    

}

CCTableViewCell* HelloWorld::tableCellAtIndex(CCTableView *table, unsigned int idx)
{

    CCLOG("%d",idx);
    CCString *nameString=CCString::createWithFormat("icon_%d.png",idx+1);

    CCTableViewCell *cell = table->dequeueCell();
    
    if (!cell) {
        
        cell = new CCTableViewCell();
        
        cell->autorelease();
        CCSprite *bgSprite = CCSprite::create("cell.png");
        bgSprite->setAnchorPoint(CCPointZero);
        bgSprite->setPosition(CCPointZero);
        bgSprite->setTag(789);
        cell->addChild(bgSprite);
        
        
        CCSprite *iconSprite = CCSprite::create(nameString->getCString());
        iconSprite->setScale(0.6);
        iconSprite->setAnchorPoint(CCPointZero);
        iconSprite->setPosition(ccp(25, 10));
        iconSprite->setTag(123);
        cell->addChild(iconSprite);
        
        
        CCLabelTTF *pLabel = CCLabelTTF::create(nameString->getCString(), "Arial", 30.0);
        pLabel->setPosition(ccp(200, 10));
        pLabel->setTag(456);
        pLabel->setAnchorPoint(CCPointZero);
        cell->addChild(pLabel);
    }
    else
    {
        
        //创建了就不需要再重新创建了,不然你会发现图片跟文字都不对
        CCTexture2D *aTexture=CCTextureCache::sharedTextureCache()->addImage(nameString->getCString());
        
        CCSprite *pSprite=(CCSprite *)cell->getChildByTag(123);
        
        pSprite->setTexture(aTexture);
        
    
        CCLabelTTF *pLabel = (CCLabelTTF*)cell->getChildByTag(456);
		pLabel->setString(nameString->getCString());
    
    
        
       // this->scrollBar(table);
    
    }
    
    
    return cell;

}

CCSize HelloWorld::cellSizeForTable(CCTableView *table)
{
    
    
    CCSize visibSize=CCDirector::sharedDirector()->getVisibleSize();

    return CCSizeMake(visibSize.width, 84);
    
    
}

void HelloWorld::tableCellHighlight(CCTableView *table, CCTableViewCell *cell)
{

    CCLOG("wwww");

    CCTexture2D *aTexture=CCTextureCache::sharedTextureCache()->addImage("cell_selected.png");
    
    CCSprite *pSprite=(CCSprite *)cell->getChildByTag(789);
    
    pSprite->setTexture(aTexture);

}

void HelloWorld::tableCellUnhighlight(CCTableView *table, CCTableViewCell *cell)
{

    CCLOG("dddd");
    

    CCTexture2D *aTexture=CCTextureCache::sharedTextureCache()->addImage("cell.png");
    
    CCSprite *pSprite=(CCSprite *)cell->getChildByTag(789);
    
    pSprite->setTexture(aTexture);

}

void HelloWorld::tableCellTouched(CCTableView *table, CCTableViewCell *cell)
{

    CCLog("cell touched at index: %i", cell->getIdx());

}


OK,我们看下效果图:





一个未选择状态,一个选中状态,注意,tableCellHighlight,tableCellUnhighlight,tableCellTouched的执行先后顺序为tableCellHighlight->tableCellUnhighlight->tableCellTouched。OK,就这么简单,貌似cctableview没有自带的滚动条,可能需要自己来实现,希望以后的版本中直接加入滚动条,这样会更方便~~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: