cocos2d-x 之TableView

尹俊雅
2023-12-01

什么是TableView?


这个东西啊,很多游戏,结束后的排行榜,比如里面有20个内容,但是由于窗口受限,不能全部展示,所以像滚动条一样可以纵向(当然也可以横向)拉动的东东。

这个也要和ListView和PageView不一样的,

▪ 与ListView相比

ListView以前我也没用过,网上资料查到的也不多,就讲一下最大的不同吧。

ListView中的每个单元称为item,TableView的每个单元称为cell,如果分别创建20个单元,但每次只能显示5个单元。当ListView创建的时候,会直接创建20个item;而TableView只会创建5个cell,然后在队列中反复利用。这样做的优点就不用多说了吧。

▪ 与PageView相比

我认为的差别在于,我们用TableView的时候,每次滑动,并不会滑动固定的距离,就是说滑动的距离难以固定,而且往往伴随着偏移量,比如手往下一划,当你手离开时候,它还会继续往下划一点(就像有惯性一样)。

而PageView就不同了,如果你往下滑动,比如从编号1滑动到编号3的一半,它会自己判断最后定位到滑到3还是4。就像你翻书一样,不可能翻一半,要么不翻动,要么翻过去。


怎么用TableView?

1.现在要使用的场景中配置好环境,具体方法可以点击链接:开发环境的基本搭建和配置

链接中前半段不用看,后半段讲的才是3.0以后版本怎么使用,首先得添加头文件:

#include "cocos2d.h"
#include "cocos-ext.h"
using namespace std;

USING_NS_CC;
USING_NS_CC_EXT;
之后把添加包含路径。

还有继承类

class HelloWorld : public cocos2d::Layer,TableViewDataSource
{


2.需要重写的函数

// 当滑动tableview时触发该方法 参数为当前的tableview对象  
virtual void scrollViewDidScroll(ScrollView* view) {};  
// 当tableview被放大或缩小时触发该方法  参数为当前tableview对象  
virtual void scrollViewDidZoom(ScrollView* view) {}  
// 当cell被点击时调用该方法 参数为当前的tableview对象与被点击的cell对象  
virtual void tableCellTouched(TableView* table, TableViewCell* cell);  
// 设置tableview的Cell大小  
virtual Size tableCellSizeForIndex(TableView *table, ssize_t idx);  
// 获取编号为idx的cell  
virtual TableViewCell* tableCellAtIndex(TableView *table, ssize_t idx);  
// 设置tableview中cell的个数  
virtual ssize_t numberOfCellsInTableView(TableView *table);  


3.在init函数中建立TableView:

visibleSize = Director::getInstance()->getVisibleSize();  
  
//创建一个talbleview 将datasource设置为当前的类的对象 tableview的显示区域大小为 300 * 300  
TableView* tableView = TableView::create(this, CCSizeMake(300,300));  
//设置tableview为水平方向  ScrollView::Direction::VERTICAL 为垂直,ScrollView::Direction::HORIZONTAL 为水平  
tableView->setDirection(ScrollView::Direction::VERTICAL);  
//设置位置  
tableView->setPosition(Vec2(visibleSize.width/2,visibleSize.height/3));  
// 填充顺序  
tableView->setVerticalFillOrder(TableView::VerticalFillOrder::TOP_DOWN);  
//添加tableview到当前layer  
this->addChild(tableView);  
//加载tableview  
tableView->reloadData();  

4.定义前面需要重写的函数

Size HelloWorld::cellSizeForTable(TableView *table)
{
	return Size(300,50);
}

TableViewCell* HelloWorld::tableCellAtIndex(cocos2d::extension::TableView *table, ssize_t idx)
{
	TableViewCell * cell = table->dequeueCell();
	Label* label;

	if(cell==NULL)
	{
		cell = TableViewCell::create();
		label = Label::create();
		label->setTag(2);
		label->setSystemFontSize(20);
		cell->addChild(label);
	}
	else
	{
		label = (Label*)cell->getChildByTag(2);
	}

	label->setString(StringUtils::format("Label %d",(int)idx));

	return cell;
}

ssize_t HelloWorld::numberOfCellsInTableView(TableView *table){
	return 100;
}


 类似资料: