cocos2d-x中的CCTableView的相关用法
2016-02-09 12:38
369 查看
版权声明:本文为博主原创文章,未经博主允许不得转载。
当应用中出现列表时,就需要用到CCTableView,具体的用法见下面的代码:
[cpp] view
plain copy
#ifndef __loading__marketContent__
#define __loading__marketContent__
#include <iostream>
#include "cocos2d.h"
#include "cocos-ext.h"
USING_NS_CC;
class marketContent :public CCLayer,public cocos2d::extension::CCTableViewDataSource,public cocos2d::extension::CCTableViewDelegate
{
public:
virtual bool init(int type);
virtual void scrollViewDidScroll(cocos2d::extension::CCScrollView* view); //直接重写吧,什么也不做,基本上用不到
virtual void scrollViewDidZoom(cocos2d::extension::CCScrollView* view); //直接重写吧,什么也不做,基本上用不到
//处理触摸事件,可以计算点击的是哪一个子项
virtual void tableCellTouched(cocos2d::extension::CCTableView* table, cocos2d::extension::CCTableViewCell* cell);
//每一项的宽度和高度,第一个是指定所有列表的宽带和高度,当列表宽高不需要变化时,就用这个吧,当列表需要变化时(比如点击时改变宽高),就用第二个吧,这个分别设置指定的那个子项的宽高。
virtual cocos2d::CCSize cellSizeForTable(cocos2d::extension::CCTableView *table);
virtual cocos2d::CCSize tableCellSizeForIndex(cocos2d::extension::CCTableView *table, unsigned int idx);
//生成列表每一项的内容
virtual cocos2d::extension::CCTableViewCell* tableCellAtIndex(cocos2d::extension::CCTableView *table, unsigned int idx);
//一共多少项,返回列表的子项的个数
virtual unsigned int numberOfCellsInTableView(cocos2d::extension::CCTableView *table);
//下面的后面会用到,就先不解释
static marketContent *create(int ty); //重写create方法,因为CREATE_FUNC()是不能传参的
int type;
int isOpen;
int lastOpen;
cocos2d::extension::CCTableView *pTableView;
void buyNow(CCObject *pSender);
};
.cpp的代码:
[cpp] view
plain copy
#include "marketContent.h"
#include "marketContentSprite.h"
USING_NS_CC_EXT;
marketContent * marketContent::create(int ty)
{
marketContent *pRet = new marketContent();
if (pRet && pRet->init(ty)) // 重写也就再这里传个参数,这个参数设定是显示的那个列表
{
pRet->autorelease();
return pRet;
}
else
{
CC_SAFE_DELETE(pRet);
return NULL;
}
}
bool marketContent::init(int newtype)
{
if(!CCLayer::init())
{
return false;
}
type = newtype;
isOpen = 0;
lastOpen = 0; //下面的CCSizeMake是很关键的,他设定列表显示的范围,如果列表上面显示不全,总有一部分被遮挡,那就调整高度吧,同理,长度也一样
pTableView = CCTableView::create(this, CCSizeMake(960, 510));
pTableView->setDirection(kCCScrollViewDirectionVertical); //设置列表为上下滑动的
pTableView->setPosition(CCPointZero); //设置列表显示的初始位置
pTableView->setDelegate(this); //记得要注册
pTableView->setVerticalFillOrder(kCCTableViewFillTopDown); //列表设置为从小到大显示,及idx从0开始
this->addChild(pTableView);
pTableView->reloadData(); //重新加载数据,当遮挡后,再显示,是必须的。
return true;
}
下面是主要代码:
[cpp] view
plain copy
cocos2d::extension::CCTableViewCell * marketContent::tableCellAtIndex(CCTableView *table, unsigned int idx)
{
CCString *string = CCString::createWithFormat("%d", idx);
//此函数会缓存列表邻近两个暂时不显示的列,这样,当滑动列表时,可以快速创建出列表,提高效率,所以,最好不要每次都重新生成cell
//如果列表子项是可变的,那就用下面的方法,否则,就推荐用这个方法,产生不变大小的子项.
//CCTableViewCell *cell = table->dequeueCell();
CCTableViewCell *cell = table->cellAtIndex(idx);
if (!cell)
{
cell = new CCTableViewCell();
cell->autorelease();
if(type == 1)
{ //另一个类,产生可变的精灵,其实就是继承自CCSprite,根据点击与否,产生不同大小的列表子项,大的由两张背景图片组成,小的由一张图片组成。
MarketContentSprite *backGround = MarketContentSprite::create(idx, isOpen);
cell->addChild(backGround ,1);
cell->setTag(idx);
backGround->setPosition(ccp(480, 50));
}
else
{
CCSprite *backGround = CCSprite::create("market_item_2.png");
if(idx == 0)
{
backGround = CCSprite::create("market_item_1.png");
}
else if(idx == 5)
{
backGround = CCSprite::create("market_item_3.png");
}
cell->addChild(backGround ,1);
backGround->setPosition(ccp(480, 50)); //这里设置不当,也有可能导致列表显示不全等
CCString *string = CCString::createWithFormat("market_chipsLogo%d.png",idx);
CCSprite *moneyLogo = CCSprite::create(string->getCString());
backGround->addChild(moneyLogo);
moneyLogo->setPosition(ccp(120, 50));
CCSprite *normSprite = CCSprite::create("btn_market_buy_pre.png");
CCLabelTTF *buyttf = CCLabelTTF::create("buy now", "", 22);
buyttf->setPosition(ccp(70, 30));
normSprite->addChild(buyttf);
CCSprite *selectedSprite = CCSprite::create("btn_market_buy.png");
buyttf = CCLabelTTF::create("buy now", "", 29);
buyttf->setPosition(ccp(70, 30));
selectedSprite->addChild(buyttf); //设置不同的字体,从而使点击时,看到变大的字体
CCMenuItemSprite *buysprite = CCMenuItemSprite::create(normSprite, selectedSprite, NULL, this, menu_selector(marketContent::buyNow));
CCMenu *buyMenu = CCMenu::create(buysprite,NULL);
backGround->addChild(buyMenu,1);
buyMenu->setPosition(ccp(600, 50));
}
CCLabelTTF *label = CCLabelTTF::create(string->getCString(), "Helvetica", 20.0);
label->setPosition(CCPointZero);
label->setTag(123);
cell->addChild(label);
}
else //更改显示的内容,因为通过cellAtIndex和dequeueCell缓存返回的值,原来显示的内容和现在的可能是不同的,所以需要重置,否则,通过几次滑动后,列表就会混乱
{
CCLabelTTF *label = (CCLabelTTF*)cell->getChildByTag(123);
label->setString(string->getCString());
}
return cell;
}
unsigned int marketContent::numberOfCellsInTableView(cocos2d::extension::CCTableView *table)
{
if(type == 1)
{
return 4;
}
else
{
return 6;
}
}
CCSize marketContent::cellSizeForTable(cocos2d::extension::CCTableView *table)
{
return CCSizeMake(960, 102);
}
CCSize marketContent::tableCellSizeForIndex(cocos2d::extension::CCTableView *table, unsigned int idx)
{
if(type == 1)
{
if(idx == isOpen - 1) //根据不同的状态,返会不同的子项的宽度
{
return CCSizeMake(960, 264);
}
else
{
return CCSizeMake(960,102); }
}
else
{
return CCSizeMake(960, 102);
}
}
void marketContent::scrollViewDidScroll(cocos2d::extension::CCScrollView *view)
{
}
void marketContent::scrollViewDidZoom(cocos2d::extension::CCScrollView *view)
{
}
void marketContent::tableCellTouched(CCTableView *table, cocos2d::extension::CCTableViewCell *cell)
{
int idx = cell->getIdx();
if(type == 1)
{
if(idx == isOpen -1) //处理触摸事件,更改显示状态
{
isOpen = 0; lastOpen = 0;
pTableView->reloadData();
return;
}
idx = cell->getIdx();
isOpen = idx +1;
lastOpen = isOpen;
pTableView->reloadData();
if(isOpen == 4)
{
pTableView->setContentOffset(pTableView->maxContainerOffset()); //如果是最后一个的话,列表向上弹到最大位置
}
}
CCLog("%d",idx);
}
void marketContent::buyNow(cocos2d::CCObject *pSender)
{ // 获得点击列表的子项,确定点击的按钮
CCTableViewCell *tablecell = (CCTableViewCell *)(((CCMenu*)pSender)->getParent()->getParent()->getParent());
CCLog("hhh %d",tablecell->getIdx());
}
顶
2
踩
当应用中出现列表时,就需要用到CCTableView,具体的用法见下面的代码:
[cpp] view
plain copy
#ifndef __loading__marketContent__
#define __loading__marketContent__
#include <iostream>
#include "cocos2d.h"
#include "cocos-ext.h"
USING_NS_CC;
class marketContent :public CCLayer,public cocos2d::extension::CCTableViewDataSource,public cocos2d::extension::CCTableViewDelegate
{
public:
virtual bool init(int type);
virtual void scrollViewDidScroll(cocos2d::extension::CCScrollView* view); //直接重写吧,什么也不做,基本上用不到
virtual void scrollViewDidZoom(cocos2d::extension::CCScrollView* view); //直接重写吧,什么也不做,基本上用不到
//处理触摸事件,可以计算点击的是哪一个子项
virtual void tableCellTouched(cocos2d::extension::CCTableView* table, cocos2d::extension::CCTableViewCell* cell);
//每一项的宽度和高度,第一个是指定所有列表的宽带和高度,当列表宽高不需要变化时,就用这个吧,当列表需要变化时(比如点击时改变宽高),就用第二个吧,这个分别设置指定的那个子项的宽高。
virtual cocos2d::CCSize cellSizeForTable(cocos2d::extension::CCTableView *table);
virtual cocos2d::CCSize tableCellSizeForIndex(cocos2d::extension::CCTableView *table, unsigned int idx);
//生成列表每一项的内容
virtual cocos2d::extension::CCTableViewCell* tableCellAtIndex(cocos2d::extension::CCTableView *table, unsigned int idx);
//一共多少项,返回列表的子项的个数
virtual unsigned int numberOfCellsInTableView(cocos2d::extension::CCTableView *table);
//下面的后面会用到,就先不解释
static marketContent *create(int ty); //重写create方法,因为CREATE_FUNC()是不能传参的
int type;
int isOpen;
int lastOpen;
cocos2d::extension::CCTableView *pTableView;
void buyNow(CCObject *pSender);
};
.cpp的代码:
[cpp] view
plain copy
#include "marketContent.h"
#include "marketContentSprite.h"
USING_NS_CC_EXT;
marketContent * marketContent::create(int ty)
{
marketContent *pRet = new marketContent();
if (pRet && pRet->init(ty)) // 重写也就再这里传个参数,这个参数设定是显示的那个列表
{
pRet->autorelease();
return pRet;
}
else
{
CC_SAFE_DELETE(pRet);
return NULL;
}
}
bool marketContent::init(int newtype)
{
if(!CCLayer::init())
{
return false;
}
type = newtype;
isOpen = 0;
lastOpen = 0; //下面的CCSizeMake是很关键的,他设定列表显示的范围,如果列表上面显示不全,总有一部分被遮挡,那就调整高度吧,同理,长度也一样
pTableView = CCTableView::create(this, CCSizeMake(960, 510));
pTableView->setDirection(kCCScrollViewDirectionVertical); //设置列表为上下滑动的
pTableView->setPosition(CCPointZero); //设置列表显示的初始位置
pTableView->setDelegate(this); //记得要注册
pTableView->setVerticalFillOrder(kCCTableViewFillTopDown); //列表设置为从小到大显示,及idx从0开始
this->addChild(pTableView);
pTableView->reloadData(); //重新加载数据,当遮挡后,再显示,是必须的。
return true;
}
下面是主要代码:
[cpp] view
plain copy
cocos2d::extension::CCTableViewCell * marketContent::tableCellAtIndex(CCTableView *table, unsigned int idx)
{
CCString *string = CCString::createWithFormat("%d", idx);
//此函数会缓存列表邻近两个暂时不显示的列,这样,当滑动列表时,可以快速创建出列表,提高效率,所以,最好不要每次都重新生成cell
//如果列表子项是可变的,那就用下面的方法,否则,就推荐用这个方法,产生不变大小的子项.
//CCTableViewCell *cell = table->dequeueCell();
CCTableViewCell *cell = table->cellAtIndex(idx);
if (!cell)
{
cell = new CCTableViewCell();
cell->autorelease();
if(type == 1)
{ //另一个类,产生可变的精灵,其实就是继承自CCSprite,根据点击与否,产生不同大小的列表子项,大的由两张背景图片组成,小的由一张图片组成。
MarketContentSprite *backGround = MarketContentSprite::create(idx, isOpen);
cell->addChild(backGround ,1);
cell->setTag(idx);
backGround->setPosition(ccp(480, 50));
}
else
{
CCSprite *backGround = CCSprite::create("market_item_2.png");
if(idx == 0)
{
backGround = CCSprite::create("market_item_1.png");
}
else if(idx == 5)
{
backGround = CCSprite::create("market_item_3.png");
}
cell->addChild(backGround ,1);
backGround->setPosition(ccp(480, 50)); //这里设置不当,也有可能导致列表显示不全等
CCString *string = CCString::createWithFormat("market_chipsLogo%d.png",idx);
CCSprite *moneyLogo = CCSprite::create(string->getCString());
backGround->addChild(moneyLogo);
moneyLogo->setPosition(ccp(120, 50));
CCSprite *normSprite = CCSprite::create("btn_market_buy_pre.png");
CCLabelTTF *buyttf = CCLabelTTF::create("buy now", "", 22);
buyttf->setPosition(ccp(70, 30));
normSprite->addChild(buyttf);
CCSprite *selectedSprite = CCSprite::create("btn_market_buy.png");
buyttf = CCLabelTTF::create("buy now", "", 29);
buyttf->setPosition(ccp(70, 30));
selectedSprite->addChild(buyttf); //设置不同的字体,从而使点击时,看到变大的字体
CCMenuItemSprite *buysprite = CCMenuItemSprite::create(normSprite, selectedSprite, NULL, this, menu_selector(marketContent::buyNow));
CCMenu *buyMenu = CCMenu::create(buysprite,NULL);
backGround->addChild(buyMenu,1);
buyMenu->setPosition(ccp(600, 50));
}
CCLabelTTF *label = CCLabelTTF::create(string->getCString(), "Helvetica", 20.0);
label->setPosition(CCPointZero);
label->setTag(123);
cell->addChild(label);
}
else //更改显示的内容,因为通过cellAtIndex和dequeueCell缓存返回的值,原来显示的内容和现在的可能是不同的,所以需要重置,否则,通过几次滑动后,列表就会混乱
{
CCLabelTTF *label = (CCLabelTTF*)cell->getChildByTag(123);
label->setString(string->getCString());
}
return cell;
}
unsigned int marketContent::numberOfCellsInTableView(cocos2d::extension::CCTableView *table)
{
if(type == 1)
{
return 4;
}
else
{
return 6;
}
}
CCSize marketContent::cellSizeForTable(cocos2d::extension::CCTableView *table)
{
return CCSizeMake(960, 102);
}
CCSize marketContent::tableCellSizeForIndex(cocos2d::extension::CCTableView *table, unsigned int idx)
{
if(type == 1)
{
if(idx == isOpen - 1) //根据不同的状态,返会不同的子项的宽度
{
return CCSizeMake(960, 264);
}
else
{
return CCSizeMake(960,102); }
}
else
{
return CCSizeMake(960, 102);
}
}
void marketContent::scrollViewDidScroll(cocos2d::extension::CCScrollView *view)
{
}
void marketContent::scrollViewDidZoom(cocos2d::extension::CCScrollView *view)
{
}
void marketContent::tableCellTouched(CCTableView *table, cocos2d::extension::CCTableViewCell *cell)
{
int idx = cell->getIdx();
if(type == 1)
{
if(idx == isOpen -1) //处理触摸事件,更改显示状态
{
isOpen = 0; lastOpen = 0;
pTableView->reloadData();
return;
}
idx = cell->getIdx();
isOpen = idx +1;
lastOpen = isOpen;
pTableView->reloadData();
if(isOpen == 4)
{
pTableView->setContentOffset(pTableView->maxContainerOffset()); //如果是最后一个的话,列表向上弹到最大位置
}
}
CCLog("%d",idx);
}
void marketContent::buyNow(cocos2d::CCObject *pSender)
{ // 获得点击列表的子项,确定点击的按钮
CCTableViewCell *tablecell = (CCTableViewCell *)(((CCMenu*)pSender)->getParent()->getParent()->getParent());
CCLog("hhh %d",tablecell->getIdx());
}
顶
2
踩
相关文章推荐
- cocos2d-x特效之CCControlPotentiometer
- cocos2d-x Loading界面实现资源加载
- cocos2d-x调用scheduleUpdate()不执行update()方法的解决办法
- cocos2d-x过程动作CCProgressTo示例学习笔记
- cocos2d-x多点触控实现缩放及相关问题的解决方法
- cocos2d-x部分函数介绍
- cocos2d-x通过jni实现c++和java互调
- cocos2d-x与安卓混编实现“更换头像”
- cocos2d-x3.2 的UserDefault
- Cocos2d-x 3.2在mac下android的环境配置
- cocos2d-x 帧动画创建一
- cocos2dx3.2 异步加载和动态加载
- cocos2dx3.0 超级马里奥开发笔记(一)——loadingbar、TableView和pageview的使用
- 【Cocos2d-x源码分析】 UserDefault如何保存本地数据
- 【玩转cocos2d-x之四十】怎样在Cocos2d-x 3.0中使用opengl shader?
- cocos2d-x 3.1 集成 云风pbc
- Cocos2d-x 常用特效 Effect API
- Cocos2d-x常用动作 Action API
- cocos2dx 3.3 AssetsManager测试更新
- cocos2d-x 3.0 新特性样例