Use of TableView in Cocos2d-x3.1
1. First, check the header file of TableView.
# Include "cocos2d. h "# include" extensions/cocos-ext.h "// header file containing TableView # include" ItemAdapter. h "// adaption class USING_NS_CC; // Event Callback function typedef std: function
MenuCallBack; // inherited 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) {}; // slide virtual void scrollViewDidZoom (cocos2d: extension: ScrollView * view) {}; // enlarge virtual void tableCellTouched (cocos2d: extension: TableView * table, cocos2d: extension: TableViewCell * cell); // touch event virtual cocos2d :: size tableCellSizeForIndex (cocos2d: extension: TableView * table, ssize_t idx); // Cell Size virtual cocos2d: extension: TableViewCell * tableCellAtIndex (cocos2d: extension :: tableView * table, ssize_t idx); // Add Cell virtual ssize_t numberOfCellsInTableView (cocos2d: extension: TableView * table); // set the number of cells void touchEvent (cocos2d :: ref * pSender, cocos2d: ui: Widget: TouchEventType); // touch event void addMenuTouchEvent (const menuCallBack & callback); // callback function Size winSize; cocos2d :: ref * _ pSender; cocos2d: ui: Widget: TouchEventType _ type; menuCallBack _ menuCallBack; std: vector
Item; std: vector
ItemIcon ;};
# Include "MenuTableView. h "# include" ui/CocosGUI. h "# include" HomeLayer. h "USING_NS_CC; USING_NS_CC_EXT; // declaration containing the cocos-ext.h header file using namespace ui; bool MenuTableView: init () {bool bRet = false; do {CC_BREAK_IF (! Layer: init (); log ("MenuTableView"); // item must be defined first // set the Item name and background item. push_back ("progress"); item. push_back ("yoy"); item. push_back ("period-over-period"); item. push_back ("Product Line"); item. push_back ("ranking"); 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_bac K ("home_list_bg_paiming-.png"); winSize = Director: getInstance ()-> getWinSize (); // create TableView object TableView * tableView = TableView: create (this, size (winSize. width, winSize. height * 6/7); tableView-> setDirection (cocos2d: extension: ScrollView: Direction: VERTICAL); // set TableView to tableView-> ignoreAnchorPointForPosition (false ); tableView-> setAnchorPoint (Vec2: ZERO); // you can set the anchorpoint tableView-> setPosition (Vec2: Z ERO); // set the location tableView-> setVerticalFillOrder (TableView: VerticalFillOrder: TOP_DOWN); // set TableView attributes tableView-> setDelegate (this ); // set the delegate this-> addChild (tableView); tableView-> reloadData (); // update the data this-> setTouchEnabled (true); // The touchable bRet = true ;} while (0); return bRet;} // Item touch event void MenuTableView: tableCellTouched (cocos2d: extension: TableView * table, cocos2d: extension: TableViewCell * cell) {log ("ce Ll touched at index % zd ", cell-> getIdx ();} // set the Cell Size MenuTableView: tableCellSizeForIndex (cocos2d: extension: TableView * table, ssize_t idx) {return Size (winSize. width, winSize. height/6);} // Add CellTableViewCell * 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 (); // adaptation Class menu-> itemIcon-> loadTexture (itemIcon. at (idx); // Add Icon menu-> itemName-> setString (item. at (idx); // Add Text menu-> touchBtn-> setTag (10 + idx); menu-> setContentSize (Size (winSize. width, winSize. height/8); // set the View Size log ("menu. width = % lf, menu. height = % lf ", menu-> getContentSize (). width, menu-> getContentSize (). height); menu-> setSize (Size (winSize. width, winSize. height/8); // set the size menu-> setLayoutType (cocos2d: ui: Layout: Type: RELATIVE ); // set the layout type menu-> ignoreAnchorPointForPosition (false); menu-> setAnchorPoint (Vec2: ZERO); // set the anchmenu-> touchBtn-> addTouchEventListener (CC_CALLBACK_2 (MenuTableView:: touchEvent, this); // sets the Item touch event cell-> addChild (menu); return cell;} // sets the number of cells ssize_t MenuTableView: numberOfCellsInTableView (cocos2d :: extension: TableView * table) {return 5;} void MenuTableView: touchEvent (cocos2d: Ref * pSender, cocos2d: ui: Widget: TouchEventType type) // callback function, execute HelloWorld. cpp touch event {if (_ menuCallBack) _ menuCallBack (pSender, type);} // assign a value to _ menuCallBack. callback is HelloWorld. touchEvent event void MenuTableView in cpp: addMenuTouchEvent (const menuCallBack & callback) {_ menuCallBack = callback ;}
2. Tool class: Adaptation
#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;}
Add the following code to 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
( 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: {
log("3");
} break; case RingCompare_Tag: {
log("4");
} break; case ProductLine_Tag: {
log("5");
} break; default: break; } } break; default: break; }}