首页 > 代码库 > Cocos2d-x3.1中的TableView的使用

Cocos2d-x3.1中的TableView的使用

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; }}




Cocos2d-x3.1中的TableView的使用