cocos2dx 3.8中ScrollView记载TableView(代码详解)
来源:互联网 发布:淘宝店铺装修注意事项 编辑:程序博客网 时间:2024/05/18 22:51
啥都不说 代码先附上:
关于结构的建立 :
virtual Size tableCellSizeForIndex(TableView *table, ssize_t idx);
virtual TableViewCell* tableCellAtIndex(TableView *table, ssize_t idx);
virtual ssize_t numberOfCellsInTableView(TableView *table);
virtual void tableCellTouched(TableView* table, TableViewCell* cell);
virtual void scrollViewDidScroll(ScrollView* view);
virtual void scrollViewDidZoom(ScrollView* view);
由于有三个层 每个层次里面都是 TableIndexCell 所以需要区分是那一个 TableView
创建结构:
m_scrollView;
m_tableViewleft;
m_tabelViewCenter;
m_tableViewRight;
m_curPage; //当前页
m_firstPoint; //首先点击的点
m_offset; //偏移的数值
m_vertical; //判断是使用 垂直还是水平滚动
m_horizontal;
m_viewSize; //设置的可见层
首先创建一个 scrollview 需要主要的有:
setViewSize()设置可视大小
setTouchEnable(false) 需要关闭 scrollView
创建一个层:
auto pContainer = Layer::create();
pContainer->setContentSize() 设置为包含的大小:Size(m_viewSize.width*3,m_viewSize.height)
pContainer->setAnchorPoint(Vec2::ZERO);
pContainer->setPosition(Vec2::ZERO);
m_scrollView->addchild(pContainer);
开始创建三个TableView 由于三个TableView 之间没有区别所以 创建一个就可以了
由于TableView中的Create函数:
TableView * tableView::create(TableViewDataSource *dataSource,Size size,Node * container)
{
TableView * table = new TableView();
table->initWithViewSize(size,container);
table->autolease();
table->setDataSource(dataSource);
table->_updateCellPositions(); //在这一步 会调用 TableCellAtIndex 所有table->getTag() 会报错
table->_updateContentSize();
}
m_leftTable = new TableView();
m_leftTable->initWithViewSize(m_viewSize, NULL);
m_leftTable->autorelease();
m_leftTable->setDataSource(this);
m_leftTable->setTag(Table_Left);
m_leftTable->ignoreAnchorPointForPosition(false);
注册触摸事件:
在onTouchBegan m_firstPoint赋值
m_offset 赋值
在 onTouchMove
如果在leftView中不能 向左偏移
#ifndef __COMBINE_VIEW_H__#define __COMBINE_VIEW_H__#include "cocos2d.h"#include "cocos-ext.h"USING_NS_CC;USING_NS_CC_EXT;enum Table{Table_Left = 0,Table_Center,Table_Right};class CombineView : public Layer,TableViewDataSource,TableViewDelegate{public:CombineView();~CombineView();virtual bool init();static cocos2d::Scene * create();virtual Size tableCellSizeForIndex(TableView *table, ssize_t idx);virtual TableViewCell* tableCellAtIndex(TableView *table, ssize_t idx);virtual ssize_t numberOfCellsInTableView(TableView *table);virtual void tableCellTouched(TableView* table, TableViewCell* cell);virtual void scrollViewDidScroll(ScrollView* view);virtual void scrollViewDidZoom(ScrollView* view);public:void SetTouch(bool isTouched);//对scrollview的调整void adjustScrollView(float offset);private:ScrollView * m_scrollView;TableView * m_leftTable;TableView * m_centerTable;TableView * m_rightTable;//scrollview当前显示的页数int m_curPage;//第一个触摸点Vec2 m_firstPoint;//scrollview的偏移Vec2 m_offset;//判断第一次滑动方向bool m_horizontal;bool m_vertical;//View的大小Size m_viewSize;};#endif // !__COMBINE_VIEW_H__
关于结构的建立 :
#include "CombineView.h"CombineView::CombineView(){m_scrollView = NULL;m_leftTable = NULL;m_centerTable = NULL;m_rightTable = NULL;m_curPage = 0;m_firstPoint = Vec2(0,0);m_offset = Vec2(0,0);m_vertical = false;m_horizontal = false;m_viewSize = Size(0,0);}CombineView::~CombineView(){}cocos2d::Scene * CombineView::create(){auto scene = Scene::create();auto pLayer = new CombineView();if (scene && pLayer && pLayer->init()){pLayer->autorelease();scene->addChild(pLayer);return scene;}else{delete pLayer;pLayer = NULL;return NULL;}}bool CombineView::init(){if (!Layer::init()){return false;}auto bgSize = Director::getInstance()->getWinSize();auto pBg = Sprite::create("combineview/bg_big.png");pBg->setPosition(Vec2(bgSize.width / 2,bgSize.height / 2));this->addChild(pBg);auto pView = Sprite::create("combineview/bg_small.png");pView->setPosition(Vec2(bgSize.width / 2,bgSize.height / 2));this->addChild(pView,2);auto BoxSize = pView->getContentSize();m_viewSize = Size(BoxSize.width,BoxSize.height * 0.85);//添加标题auto plabel = Label::createWithTTF("CombineView Test","fonts/Marker Felt.ttf",30);plabel->setPosition(Vec2(BoxSize.width / 2,BoxSize.height * 0.9));pView->addChild(plabel);m_scrollView = ScrollView::create();m_scrollView->setViewSize(m_viewSize);m_scrollView->setContentOffset(Point::ZERO);m_scrollView->setDelegate(this);m_scrollView->setDirection(ScrollView::Direction::HORIZONTAL);m_scrollView->setAnchorPoint(Point::ZERO);m_scrollView->setPosition(Vec2::ZERO);m_scrollView->setTouchEnabled(false);//因为我们不需要scrollview的触摸,因为太糟糕~pView->addChild(m_scrollView);//添加内容auto pContainer = Layer::create();pContainer->setContentSize(Size(m_viewSize.width * 3,m_viewSize.height));pContainer->setAnchorPoint(Point::ZERO);pContainer->setPosition(Vec2::ZERO);m_scrollView->setContainer(pContainer);//添加tabelviewauto containerSize = pContainer->getContentSize();m_leftTable = new TableView();m_leftTable->initWithViewSize(m_viewSize, NULL);m_leftTable->autorelease();m_leftTable->setDataSource(this);m_leftTable->setTag(Table_Left);m_leftTable->ignoreAnchorPointForPosition(false);m_leftTable->setAnchorPoint(Vec2(0.5,0.5));m_leftTable->setPosition(Vec2(containerSize.width / 6,containerSize.height / 2));m_leftTable->setDirection(ScrollView::Direction::VERTICAL);m_leftTable->setDelegate(this);m_leftTable->setVerticalFillOrder(TableView::VerticalFillOrder::BOTTOM_UP);//m_leftTable->setVerticalFillOrder(TableView::VerticalFillOrder::TOP_DOWN);m_leftTable->reloadData();pContainer->addChild(m_leftTable);m_centerTable = new TableView();m_centerTable->initWithViewSize(m_viewSize, NULL);m_centerTable->autorelease();m_centerTable->setDataSource(this);m_centerTable->setTag(Table_Center);m_centerTable->ignoreAnchorPointForPosition(false);m_centerTable->setAnchorPoint(Vec2(0.5,0.5));m_centerTable->setPosition(Vec2(containerSize.width / 2,containerSize.height / 2));m_centerTable->setDirection(ScrollView::Direction::VERTICAL);m_centerTable->setDelegate(this);m_centerTable->setVerticalFillOrder(TableView::VerticalFillOrder::TOP_DOWN);m_centerTable->reloadData();pContainer->addChild(m_centerTable);//m_rightTable = TableView::create(this, ViewSize);m_rightTable = new TableView();m_rightTable->initWithViewSize(m_viewSize, NULL);m_rightTable->autorelease();m_rightTable->setDataSource(this);m_rightTable->setTag(Table_Right);m_rightTable->ignoreAnchorPointForPosition(false);m_rightTable->setAnchorPoint(Vec2(0.5,0.5));m_rightTable->setPosition(Vec2(containerSize.width / 6 * 5,containerSize.height / 2));m_rightTable->setDirection(ScrollView::Direction::VERTICAL);m_rightTable->setDelegate(this);m_rightTable->setVerticalFillOrder(TableView::VerticalFillOrder::TOP_DOWN);m_rightTable->reloadData();pContainer->addChild(m_rightTable);/*auto menuitem = MenuItemImage::create("combineview/bg_big.png");auto menu = Menu::create(menuitem, NULL);this->addchild(menu);*///重写实现scrollview的触摸效果auto listenerT = EventListenerTouchOneByOne::create();listenerT->onTouchBegan = [=](Touch * touch,Event * pEvent){m_firstPoint = touch->getLocation();m_offset = m_scrollView->getContentOffset();if (!m_scrollView->getBoundingBox().containsPoint(m_firstPoint)){return false;}return true;};listenerT->onTouchMoved = [=](Touch * touch,Event * pEvent){auto movePoint = touch->getLocation();auto distance = movePoint.x - m_firstPoint.x;if ((distance > 0 && this->m_curPage == 0) || (distance < 0 && this->m_curPage == 2)){return;}//限制滑动方向,避免scorll和table同时滑动if (fabs(movePoint.y - m_firstPoint.y) / fabs(distance) > 0.7 || m_vertical){if (!m_horizontal){m_vertical = true;}return;}else //水平{if (!m_vertical){m_horizontal = true;}}if (m_horizontal){this->SetTouch(false);}m_scrollView->setContentOffset(Vec2(distance + m_offset.x,0));};listenerT->onTouchEnded = [=](Touch * touch,Event * pEvent){auto endPoint = touch->getLocation();auto distance = endPoint.x - m_firstPoint.x;//优化滑动效果bool flag = false;if (fabsf(distance) < 60){flag = true;if (distance < 0){m_curPage--;}else if (distance > 0){m_curPage++;}}//限制滑动方向,避免scroll和table同时滑动if (m_vertical){m_vertical = false;if (flag){if (distance > 0){m_curPage--;}else if (distance < 0){m_curPage++;}}return ;}else{this->SetTouch(true);}this->adjustScrollView(distance);m_horizontal = false;};listenerT->setSwallowTouches(true);Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listenerT,this);return true;}void CombineView::adjustScrollView(float offset){if (offset < 0){m_curPage++;}else if (offset > 0){m_curPage--;}if (m_curPage < 0){m_curPage = 0;}else if (m_curPage > 2){m_curPage = 2;}auto adjustPoint = Vec2(-m_viewSize.width * m_curPage,0);m_scrollView->setContentOffsetInDuration(adjustPoint,0.1f);}Size CombineView::tableCellSizeForIndex(TableView *table, ssize_t idx){return Size(260,60);}TableViewCell* CombineView::tableCellAtIndex(TableView *table, ssize_t idx){auto cell = table->dequeueCell();auto cellSize = this->tableCellSizeForIndex(table, idx);auto tag = table->getTag();if (!cell){cell = new TableViewCell();cell->autorelease();Sprite * pCellBg = NULL;Label * pNum = NULL;Sprite * pIcon = NULL;switch (tag){case Table_Left:{pCellBg = Sprite::create("combineview/cell.png");pNum = Label::createWithTTF("1","fonts/Marker Felt.ttf",20);pIcon = Sprite::create("combineview/book.png");}break;case Table_Center:{pCellBg = Sprite::create("combineview/cell2.png");pNum = Label::createWithTTF("2","fonts/Marker Felt.ttf",20);pIcon = Sprite::create("combineview/plane.png");}break;case Table_Right:{pCellBg = Sprite::create("combineview/cell3.png");pNum = Label::createWithTTF("3","fonts/Marker Felt.ttf",20);pIcon = Sprite::create("combineview/setting.png");}default:break;}pCellBg->setPosition(Vec2(cellSize.width / 2,cellSize.height / 2));cell->addChild(pCellBg);pNum->setColor(Color3B(255,0,0));pNum->setPosition(Vec2(cellSize.width * 0.1,cellSize.height / 2));cell->addChild(pNum);pIcon->setPosition(Vec2(cellSize.width * 0.85,cellSize.height / 2));pIcon->setScale(0.2);cell->addChild(pIcon);}return cell;}ssize_t CombineView::numberOfCellsInTableView(TableView *table){return 10;}void CombineView::tableCellTouched(TableView* table, TableViewCell* cell){}void CombineView::scrollViewDidScroll(ScrollView* view){}void CombineView::scrollViewDidZoom(ScrollView* view){}void CombineView::SetTouch(bool isTouched){m_leftTable->setTouchEnabled(isTouched);m_centerTable->setTouchEnabled(isTouched);m_rightTable->setTouchEnabled(isTouched);}在实现 过程中 需要实现的虚函数:
virtual Size tableCellSizeForIndex(TableView *table, ssize_t idx);
virtual TableViewCell* tableCellAtIndex(TableView *table, ssize_t idx);
virtual ssize_t numberOfCellsInTableView(TableView *table);
virtual void tableCellTouched(TableView* table, TableViewCell* cell);
virtual void scrollViewDidScroll(ScrollView* view);
virtual void scrollViewDidZoom(ScrollView* view);
由于有三个层 每个层次里面都是 TableIndexCell 所以需要区分是那一个 TableView
创建结构:
m_scrollView;
m_tableViewleft;
m_tabelViewCenter;
m_tableViewRight;
m_curPage; //当前页
m_firstPoint; //首先点击的点
m_offset; //偏移的数值
m_vertical; //判断是使用 垂直还是水平滚动
m_horizontal;
m_viewSize; //设置的可见层
首先创建一个 scrollview 需要主要的有:
setViewSize()设置可视大小
setTouchEnable(false) 需要关闭 scrollView
创建一个层:
auto pContainer = Layer::create();
pContainer->setContentSize() 设置为包含的大小:Size(m_viewSize.width*3,m_viewSize.height)
pContainer->setAnchorPoint(Vec2::ZERO);
pContainer->setPosition(Vec2::ZERO);
m_scrollView->addchild(pContainer);
开始创建三个TableView 由于三个TableView 之间没有区别所以 创建一个就可以了
由于TableView中的Create函数:
TableView * tableView::create(TableViewDataSource *dataSource,Size size,Node * container)
{
TableView * table = new TableView();
table->initWithViewSize(size,container);
table->autolease();
table->setDataSource(dataSource);
table->_updateCellPositions(); //在这一步 会调用 TableCellAtIndex 所有table->getTag() 会报错
table->_updateContentSize();
}
m_leftTable = new TableView();
m_leftTable->initWithViewSize(m_viewSize, NULL);
m_leftTable->autorelease();
m_leftTable->setDataSource(this);
m_leftTable->setTag(Table_Left);
m_leftTable->ignoreAnchorPointForPosition(false);
注册触摸事件:
在onTouchBegan m_firstPoint赋值
m_offset 赋值
在 onTouchMove
如果在leftView中不能 向左偏移
1 0
- cocos2dx 3.8中ScrollView记载TableView(代码详解)
- cocos2dx ScrollView,TableView,ListView区别
- cocos2dx 控件学习EditBox TableView ControlSlider ScrollView
- cocos2dx之TableView和ScrollView的混合使用
- COCOS2DX 3.X 解决TABLEVIEW 、SCROLLVIEW上的MENU问题
- 优化 scrollView 性能(tableView)
- ios 中tableview和scrollView的区别
- tableview(傻帽代码)
- Cocos2dx中TableView中一些函数的作用
- cocos2d-x ScrollView、TableView
- IOS TableView&ScrollView
- TableView and ScrollView
- ScrollView上放多个tableview
- tableView中cell的删除、插入、移动、复制粘贴问题详解代码分析
- Android中ScrollView使用详解
- cocos2d-js 中scrollview详解
- Android控件中ScrollView详解
- Android中ScrollView使用详解
- ./ ../ /之间的区别
- 关于Android 签名的问题
- 为什么我们应该尽快升级到 HTTPS?
- DataCastle[用户人品预测竞赛]——获奖团队分享
- mysql与oracle中时间函数
- cocos2dx 3.8中ScrollView记载TableView(代码详解)
- Java数据通讯中使用Googgle Protobuf 序列化与反序列化
- iOS移除父视图的子视图
- App测试流程
- java.swing中 真正认识 JFrame 和 getContentPane() 方法
- java多线程下的视频转码
- 免安装版tomcat出问题的时候来看看安装版吧!
- matlab一些常用的命令(自用)
- TortoiseSVN客户端使用方法