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;
}
复制代码

示例代码:http://pan.baidu.com/s/1o6k9MEA

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值