cocos2d-x給CCTableView加入下拉滾動條

 


在遊戲中經常需要以列表方式顯示UI,比如遊戲的商城,需要上下滑動來瀏覽商品列表。CCTableView就可以來實現這個效果,爲了更加人性化,我們爲CCTableView加上一個滑動條。當滑動CCTableView的時候,滑動條會移動到相應位置。反之當移動滑動條移動的時候CCTableView會移動到相應位置。

滑動條使用CCControlSlider來實現,當觸發滑動條回調函數時,修改CCTableView的偏移量爲滑動條的值。當滑動CCTableView的時候,修改滑動條的值爲CCTableView的偏移量。爲了不出現死循環,我用兩個布爾變量來控制它們的滑動,因爲滑動任何一方時都會觸發另外一方修改自己,自身被修改時又會去修改另一方,陷入死循環中導致程序崩潰。

 

具體實現:
HelloWorld.h

複製代碼

#ifndef __HELLOWORLD_SCENE_H__#define __HELLOWORLD_SCENE_H__#include "cocos2d.h"#include "cocos-ext.h"using namespace cocos2d;using namespace cocos2d::extension;class HelloWorld : public CCLayer, public CCTableViewDataSource, public CCTableViewDelegate
{public:
    HelloWorld();    ~HelloWorld();    virtual bool init();  

    static CCScene* scene();
    
    CREATE_FUNC(HelloWorld);    virtual void scrollViewDidScroll(CCScrollView *view);    virtual void scrollViewDidZoom(CCScrollView *view) {}    virtual void tableCellTouched(CCTableView *table, CCTableViewCell *cell){}    virtual CCSize tableCellSizeForIndex(CCTableView *table, unsigned int idx);    virtual CCTableViewCell* tableCellAtIndex(CCTableView *table, unsigned int idx);    virtual unsigned int numberOfCellsInTableView(CCTableView *table);private:    void valueChanged( CCObject *sender, CCControlEvent controlEvent );private:    bool m_bTable;    bool m_bSlider;
    CCSize winSize;
};#endif // __HELLOWORLD_SCENE_H__

複製代碼

 

HelloWorld.cpp

複製代碼

#include "HelloWorldScene.h"HelloWorld::HelloWorld()
{
    winSize = CCDirector::sharedDirector()->getWinSize();
}

HelloWorld::~HelloWorld()
{

}

CCScene* HelloWorld::scene()
{
    CCScene *scene = CCScene::create();
    
    HelloWorld *layer = HelloWorld::create();

    scene->addChild(layer);    return scene;
}bool HelloWorld::init()
{    if ( !CCLayer::init() )
    {        return false;
    }
 
    CCControlSlider *slider = CCControlSlider::create("sliderTrack.png","sliderTrack.png" ,"sliderThumb.png");
    slider->setAnchorPoint(ccp(0.5f, 1.0f));
    slider->setMinimumValue( -(60*20-250) );   // 單個cell的高度 × cell的總數 - CCTableView的高度
    slider->setMaximumValue(0);
    slider->setPosition(ccp(winSize.width/2+70, winSize.height/2));
    slider->setRotation(90);
    slider->setValue(-(60*20-250));            // 默認爲0
    slider->setTag(1);
    addChild(slider);    
    // 監聽滑動條
    slider->addTargetWithActionForControlEvents(this, cccontrol_selector(HelloWorld::valueChanged), CCControlEventValueChanged);
    
    CCTableView *tableView = CCTableView::create(this, CCSizeMake(60, 250));
    tableView->setDirection(kCCScrollViewDirectionVertical);
    tableView->setPosition(ccp(winSize.width/2-30, winSize.height/2-120));
    tableView->setDelegate(this);
    tableView->setTag(0);
    addChild(tableView);

    tableView->setVerticalFillOrder(kCCTableViewFillTopDown);
    tableView->reloadData();    return true;
}// 滑動條回調void HelloWorld::valueChanged( CCObject *sender, CCControlEvent controlEvent )
{
    m_bTable = false;    if ( m_bSlider )
    {
        CCTableView *tableView = (CCTableView *)getChildByTag(0);
        CCControlSlider *slider = (CCControlSlider *)getChildByTag(1);
        tableView->setContentOffset(CCSizeMake(0, slider->getValue()));
    }
    m_bTable = true;
}// 拖動CCTableView觸發void HelloWorld::scrollViewDidScroll(CCScrollView* view)
{
    m_bSlider = false;    if ( m_bTable  )
    {
        CCTableView *tableView = (CCTableView *)getChildByTag(0);
        CCControlSlider *slider = (CCControlSlider *)getChildByTag(1);
        slider->setValue(tableView->getContentOffset().y);
    }
    m_bSlider = true;
}

CCSize HelloWorld::tableCellSizeForIndex(CCTableView *table, unsigned int idx)
{     return CCSizeMake(60, 60);
}

CCTableViewCell* HelloWorld::tableCellAtIndex(CCTableView *table, unsigned int idx)
{
    CCString *string = CCString::createWithFormat("%d", idx);
    CCTableViewCell *cell = table->dequeueCell();    if (!cell)
    {
        cell = new CCTableViewCell();
        cell->autorelease();
        CCSprite *sprite = CCSprite::create("Icon.png");
        sprite->setAnchorPoint(CCPointZero);
        sprite->setPosition(ccp(0, 0));
        cell->addChild(sprite);

        CCLabelTTF *label = CCLabelTTF::create(string->getCString(), "Helvetica", 20.0);
        label->setPosition(CCPointZero);
        label->setAnchorPoint(CCPointZero);
        label->setTag(123);
        cell->addChild(label);
    }    else
    {
        CCLabelTTF *label = (CCLabelTTF*)cell->getChildByTag(123);
        label->setString(string->getCString());
    }    return cell;
}

unsigned int HelloWorld::numberOfCellsInTableView(CCTableView *table)
{    return 20;
}

複製代碼


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