1、首先看TableView的头文件
#include "cocos2d.h" #include "extensions/cocos-ext.h"//包含TableView的头文件 #include "ItemAdapter.h"//适配类 USING_NS_CC; //事件回调函数 typedef std::function<void(Ref*,cocos2d::ui::Widget::TouchEventType)> menuCallBack; //继承类 class MenuTableView : public cocos2d::Layer, public cocos2d::extension::TableViewDataSource, public cocos2d::extension::TableViewDelegate { public: CREATE_FUNC(MenuTableView); virtual bool init(); virtual void scrollViewDidScroll(cocos2d::extension::ScrollView* view) {};//滑动 virtual void scrollViewDidZoom(cocos2d::extension::ScrollView* view) {}; //放大 virtual void tableCellTouched(cocos2d::extension::TableView* table, cocos2d::extension::TableViewCell* cell);//触摸事件 virtual cocos2d::Size tableCellSizeForIndex(cocos2d::extension::TableView *table, ssize_t idx);//Cell大小 virtual cocos2d::extension::TableViewCell* tableCellAtIndex(cocos2d::extension::TableView *table, ssize_t idx);//添加Cell virtual ssize_t numberOfCellsInTableView(cocos2d::extension::TableView *table);//设置Cell个数 void touchEvent(cocos2d::Ref *pSender, cocos2d::ui::Widget::TouchEventType type);//触摸事件 void addMenuTouchEvent(const menuCallBack& callback);//回调函数 Size winSize; cocos2d::Ref* _pSender; cocos2d::ui::Widget::TouchEventType _type; menuCallBack _menuCallBack; std::vector<std::string> item; std::vector<std::string> itemIcon; };
#include "MenuTableView.h" #include "ui/CocosGUI.h" #include "HomeLayer.h" USING_NS_CC; USING_NS_CC_EXT;//包含cocos-ext.h头文件的声明 using namespace ui; bool MenuTableView::init() { bool bRet = false; do { CC_BREAK_IF(!Layer::init()); log("MenuTableView"); //item must be defined first//设置Item名称和背景 item.push_back("进度"); item.push_back("同比"); item.push_back("环比"); item.push_back("产品线"); item.push_back("排名"); itemIcon.push_back("home_list_bg_jindu.png"); itemIcon.push_back("home_list_bg_tongbi.png"); itemIcon.push_back("home_list_bg_huanbi.png"); itemIcon.push_back("home_list_bg_chanpinxian-.png"); itemIcon.push_back("home_list_bg_paiming-.png"); winSize = Director::getInstance()->getWinSize(); //创建TableView对象 TableView* tableView = TableView::create(this,Size(winSize.width,winSize.height*6/7)); tableView->setDirection(cocos2d::extension::ScrollView::Direction::VERTICAL);//设置TableView方向 tableView->ignoreAnchorPointForPosition(false); tableView->setAnchorPoint(Vec2::ZERO);//设置锚点 tableView->setPosition(Vec2::ZERO);//设置位置 tableView->setVerticalFillOrder(TableView::VerticalFillOrder::TOP_DOWN);//设置TableView的属性 tableView->setDelegate(this);//设置委托 this->addChild(tableView); tableView->reloadData();//更新数据 this->setTouchEnabled(true);//可触摸 bRet = true; }while(0); return bRet; } //Item触摸事件 void MenuTableView::tableCellTouched(cocos2d::extension::TableView *table, cocos2d::extension::TableViewCell *cell) { log("cell touched at index %zd", cell->getIdx()); } //设置Cell大小 Size MenuTableView::tableCellSizeForIndex(cocos2d::extension::TableView *table, ssize_t idx) { return Size(winSize.width,winSize.height/6); } //添加Cell TableViewCell* MenuTableView::tableCellAtIndex(cocos2d::extension::TableView *table, ssize_t idx) { TableViewCell* cell = table->dequeueCell(); if(!cell) { cell = new TableViewCell(); cell->autorelease(); } cell->removeAllChildrenWithCleanup(true); log("idx = %zd",idx); auto menu = ItemAdapter::create();//适配类 menu->itemIcon->loadTexture(itemIcon.at(idx));//添加Icon menu->itemName->setString(item.at(idx));//添加Text menu->touchBtn->setTag(10+idx); menu->setContentSize(Size(winSize.width,winSize.height/8));//设置视图大小 log("menu.width = %lf,menu.height = %lf",menu->getContentSize().width,menu->getContentSize().height); menu->setSize(Size(winSize.width,winSize.height/8));//设置大小 menu->setLayoutType(cocos2d::ui::Layout::Type::RELATIVE);//设置布局类型 menu->ignoreAnchorPointForPosition(false); menu->setAnchorPoint(Vec2::ZERO);//设置锚点 menu->touchBtn->addTouchEventListener(CC_CALLBACK_2(MenuTableView::touchEvent, this));//设置Item触摸事件 cell->addChild(menu); return cell; } //设置Cell个数 ssize_t MenuTableView::numberOfCellsInTableView(cocos2d::extension::TableView *table) { return 5; } void MenuTableView::touchEvent(cocos2d::Ref *pSender, cocos2d::ui::Widget::TouchEventType type)//回调函数,执行HelloWorld.cpp的touch事件 { if(_menuCallBack) _menuCallBack(pSender,type); } //给_menuCallBack赋值,callback是HelloWorld.cpp中的touchEvent事件 void MenuTableView::addMenuTouchEvent(const menuCallBack &callback) { _menuCallBack = callback; }
2、工具类:适配
#include "cocos2d.h" #include "ui/CocosGUI.h" USING_NS_CC; using namespace ui; class ItemAdapter : public Layout { public: CREATE_FUNC(ItemAdapter); virtual bool init(); void touchEvent(cocos2d::Ref *pSender, cocos2d::ui::Widget::TouchEventType type); ui::Text* itemName; ui::ImageView* itemIcon; ui::ImageView* bgImage; ui::Button* touchBtn; };
#include "ItemAdapter.h" #include "VisibleRect.h" bool ItemAdapter::init() { bool bRet = false; do { CC_BREAK_IF(!Layout::init()); auto winSize = Director::getInstance()->getWinSize(); itemIcon = ui::ImageView::create();//Icon itemIcon->setScaleY(VisibleRect::getImageScaleY()); itemIcon->setScaleX(VisibleRect::getImageScale()); itemIcon->ignoreAnchorPointForPosition(false); itemIcon->setAnchorPoint(Vec2(0.5,0.5)); // itemIcon->setPosition(VisibleRect::center()); auto rIcon = RelativeLayoutParameter::create(); rIcon->setAlign(cocos2d::ui::RelativeLayoutParameter::RelativeAlign::CENTER_IN_PARENT); itemIcon->setLayoutParameter(rIcon); addChild(itemIcon); itemName = ui::Text::create();//Text itemName->ignoreAnchorPointForPosition(false); itemName->setAnchorPoint(Vec2(0.5,0.5)); itemName->setFontSize(80 * VisibleRect::getImageScale()); itemName->setColor(Color3B(128,128,128)); auto rprogress = RelativeLayoutParameter::create(); rprogress->setAlign(cocos2d::ui::RelativeLayoutParameter::RelativeAlign::PARENT_LEFT_CENTER_VERTICAL); rprogress->setMargin(Margin(90*VisibleRect::getImageScale(),0,0,0)); itemName->setLayoutParameter(rprogress); addChild(itemName); bgImage = ui::ImageView::create("home_list_jiantou.png"); bgImage->setScaleY(VisibleRect::getImageScaleY()); bgImage->setScaleX(VisibleRect::getImageScale()); bgImage->ignoreAnchorPointForPosition(false); // into->setTag(PrograssBtn_Tag+i); bgImage->setAnchorPoint(Vec2(0.5,0.5)); auto rinto = RelativeLayoutParameter::create(); rinto->setAlign(cocos2d::ui::RelativeLayoutParameter::RelativeAlign::PARENT_RIGHT_CENTER_VERTICAL); rinto->setMargin(Margin(0,0,90*VisibleRect::getImageScale(),0)); bgImage->setLayoutParameter(rinto); addChild(bgImage,0); auto stencil = ui::ImageView::create("home_list_bg_jindu.png"); touchBtn = Button::create("touming.png"); log("itemsize.w = %lf,itemsize.h = %lf",stencil->getSize().width,stencil->getSize().height ); log("touchBtn.x = %lf,touchBtn.y = %lf",touchBtn->getSize().width,touchBtn->getSize().height ); auto width = stencil->getSize().width * VisibleRect::getImageScale(); auto height = stencil->getSize().height * VisibleRect::getImageScaleY(); touchBtn->setScaleX(width / touchBtn->getSize().width); touchBtn->setScaleY(height / touchBtn->getSize().height); touchBtn->ignoreAnchorPointForPosition(false); // into->setTag(PrograssBtn_Tag+i); touchBtn->setAnchorPoint(Vec2(0.5,0.5)); // touchBtn->setEnabled(true); auto rtouchBtn = RelativeLayoutParameter::create(); rtouchBtn->setAlign(cocos2d::ui::RelativeLayoutParameter::RelativeAlign::CENTER_IN_PARENT); rtouchBtn->setMargin(Margin(0,0,0,0)); touchBtn->setLayoutParameter(rtouchBtn); addChild(touchBtn,1); bRet = true; }while(0); return bRet; }
HelloWorld.cpp中添加如下代码
auto menuTableView = MenuListView::create(); menuTableView->ignoreAnchorPointForPosition(false); menuTableView->setAnchorPoint(Vec2::ZERO); menuTableView->setContentSize(Size(winSize.width, winSize.height/7*6)); menuTableView->setPosition(Vec2::ZERO); addChild(menuTableView); menuTableView->addMenuTouchEvent(CC_CALLBACK_2(HomeWorld::touchEvent,this));
void HomeLayer::touchEvent(Ref *pSender,cocos2d::ui::Widget::TouchEventType type) { auto* btn = dynamic_cast<ui::ImageView*>( pSender); switch (type) { case cocos2d::ui::Widget::TouchEventType::ENDED: { switch (btn->getTag()) { case DayReport_Tag: { log("1"); } break; case PrograssBtn_Tag: { log("2"); } break; case SameBtnCompare_Tag: { <pre name="code" class="cpp"> log("3");
} break; case RingCompare_Tag: {
log("4");
} break; case ProductLine_Tag: {
log("5");
} break; default: break; } } break; default: break; }}
时间: 2024-11-08 21:50:44