cocos2d-x给CCTableView加入下拉滚动条


在游戏中经常需要以列表方式显示UI,比如游戏的商城,需要上下滑动来浏览商品列表。CCTableView就可以来实现这个效果,为了更加人性化,我们为CCTableView加上一个滑动条。当滑动CCTableView的时候,滑动条会移动到相应位置。反之当移动滑动条移动的时候CCTableView会移动到相应位置。

滑动条使用CCControlSlider来实现,当触发滑动条回调函数时,修改CCTableView的偏移量为滑动条的值。当滑动CCTableView的时候,修改滑动条的值为CCTableView的偏移量。为了不出现死循环,我用两个布尔变量来控制它们的滑动,因为滑动任何一方时都会触发另外一方修改自己,自身被修改时又会去修改另一方,陷入死循环中导致程序崩溃。

dhlwZT1mdyZzaXplPTcyMCZzcmM9YUhSMGNDVXpRU1V5UmlVeVJtbHRZV2RsY3k1amJtbDBZbXh2Wnk1amIyMGxNa1ppYkc5bkpUSkdOVEl3T0RjNUpUSkdNakF4TkRBeEpUSkdNREl3T1RNNU5ETXROV1F3TnpSbU56RTJZelE0TkRFeU5qazFNalJrWVdRME1qbG1PV1UyTkRFdVoybG0=">

具体实现:
HelloWorld.h

复制代码

#ifndef__HELLOWORLD_SCENE_H__#define__HELLOWORLD_SCENE_H__#include"cocos2d.h"#include"cocos-ext.h"usingnamespacecocos2d;usingnamespacecocos2d::extension;classHelloWorld:publiccclayer,publicCCTableViewDataSource,publicCCTableViewDelegate
{public:
HelloWorld();~HelloWorld();virtualboolinit();

staticCCScene*scene();

CREATE_FUNC(HelloWorld);virtualvoidscrollViewDidScroll(CCScrollView*view);virtualvoidscrollViewDidZoom(CCScrollView*view){}virtualvoidtableCellTouched(CCTableView*table,CCTableViewCell*cell){}virtualCCSizetableCellSizeforIndex(CCTableView*table,unsignedintidx);virtualCCTableViewCell*tableCellAtIndex(CCTableView*table,unsignedintidx);virtualunsignedintnumberOfCellsInTableView(CCTableView*table);private:voidvalueChanged(CCObject*sender,CCControlEventcontrolEvent);private:boolm_bTable;boolm_bSlider;
CCSizewinSize;
};#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);returnscene;
}boolHelloWorld::init()
{if(!cclayer::init())
{returnfalse;
}

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();returntrue;
}//滑动条回调voidHelloWorld::valueChanged(CCObject*sender,CCControlEventcontrolEvent)
{
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触发voidHelloWorld::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;
}

CCSizeHelloWorld::tableCellSizeforIndex(CCTableView*table,unsignedintidx)
{returnCCSizeMake(60,60);
}

CCTableViewCell*HelloWorld::tableCellAtIndex(CCTableView*table,unsignedintidx)
{
CCString*string=CCString::createWithFormat("%d",idx);
CCTableViewCell*cell=table->dequeueCell();if(!cell)
{
cell=newCCTableViewCell();
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());
}returncell;
}

unsignedintHelloWorld::numberOfCellsInTableView(CCTableView*table)
{return20;
}

复制代码

相关文章

    本文实践自 RayWenderlich、Ali Hafizji 的文章《...
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@1...
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从C...
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发...
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《...
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试...