Cocos2d-x3.1中ListView的使用
阿新 • • 發佈:2019-02-17
工程中新增UIListViewTest類,定義.h和.cpp檔案。
//.h #ifndef __ListViewTest__UIListViewTest__ #define __ListViewTest__UIListViewTest__ #include "cocos2d.h" #include "ui/CocosGUI.h" USING_NS_CC; using namespace ui;//如果使用了ui/CocosGUI.h,則必須實名ui名稱空間 //ListView垂直佈局 class UIListViewTest_Vertical : public Scene { public: UIListViewTest_Vertical(); ~UIListViewTest_Vertical(); bool init();//類建立後初始化,顯示介面,與建構函式相比,建構函式是初始化資料成員,也可定義一些精靈和層 void selectedItemEvent(Ref* pSender, ListView::EventType type);//ListView觸控事件 CREATE_FUNC(UIListViewTest_Vertical)//執行::create()函式時使用 Text* _displayValueLabel;//定義一個Text用於顯示當前測試資訊 __Array* _array;//定義一個數組 }; //ListView水平佈局,其他同上 class UIListViewTest_Horizontal : public Scene { public: UIListViewTest_Horizontal(); ~UIListViewTest_Horizontal(); bool init(); void selectedItemEvent(Ref* pSender, ListView::EventType type); CREATE_FUNC(UIListViewTest_Horizontal) Text* _displayValueLabel; __Array* _array; }; #endif /* defined(__ListViewTest__UIListViewTest__) */
.cpp #include "UIListViewTest.h" const char* font_UIListViewTest = "fonts/Marker Felt.ttf";//將字型路徑定義為變數 // UIListViewTest_Vertical //建構函式,指標成員函式在初始化列表中初始化 UIListViewTest_Vertical::UIListViewTest_Vertical() : _displayValueLabel(nullptr) , _array(nullptr) { } //指標變數析構 UIListViewTest_Vertical::~UIListViewTest_Vertical() { CC_SAFE_RELEASE(_array); } //init函式,當類建立成功時,立刻執行初始化函式 bool UIListViewTest_Vertical::init() { if (Scene::init()) { Size widgetSize = Director::getInstance()->getWinSize();//獲取當前螢幕大小 _displayValueLabel = Text::create("Move by vertical direction", "fonts/Marker Felt.ttf", 32);//顯示當前Test資訊 _displayValueLabel->setAnchorPoint(Vec2(0.5f, -1.0f));//設定錨點 _displayValueLabel->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f + _displayValueLabel->getContentSize().height * 1.5f)); addChild(_displayValueLabel); //同上 Text* alert = Text::create("ListView vertical", "fonts/Marker Felt.ttf", 30); alert->setColor(Color3B(159, 168, 176)); alert->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - alert->getSize().height * 7.5f)); addChild(alert); //建立陣列 _array = Array::create(); CC_SAFE_RETAIN(_array); for (int i = 0; i < 20; ++i)//陣列存放button的名字 { __String* ccstr = __String::createWithFormat("listview_item_%d", i); _array->addObject(ccstr);//也可用pushback函式 } // Create the list view ex ListView* listView = ListView::create();//建立ListView // set list view ex direction listView->setDirection(ui::ScrollView::Direction::VERTICAL);//設定ListView佈局方向 listView->setTouchEnabled(true);//可觸控 listView->setBounceEnabled(true);//設定反彈效果 listView->setBackGroundImage("green_edit.png");//以圖片初始化背景 listView->setBackGroundImageScale9Enabled(true);//設定九妹兒 listView->setSize(Size(480, 240));//設定ListView大小 listView->ignoreContentAdaptWithSize(false);//開啟錨點設定,false可更改錨點,true不可更改,Layer預設為point(0,0),其他Node為Point(0.5,0.5) listView->setAnchorPoint(Vec2(0.5, 0.5));//設定錨點,即錨點放在節點setPosition的位置,0,0:表示節點左下角;1,1:表示節點右上角;0.5,0.5表示節點中點 listView->setPosition(Vec2((widgetSize.width / 2.0f + listView->getSize().width) / 2.0f,(widgetSize.height / 2.0f + listView->getSize().height) / 2.0f)); listView->addEventListener(CC_CALLBACK_2(UIListViewTest_Vertical::selectedItemEvent, this));//事件觸發,CC_CALLBACK_參考前面文章 addChild(listView); // create model 建立一個模型 Button* default_button = Button::create("backtotoppressed.png", "backtotopnormal.png"); default_button->setName("Title Button"); Layout* default_item = Layout::create(); default_item->setTouchEnabled(true); default_item->setSize(default_button->getSize()); default_button->setPosition(Vec2(default_item->getSize().width / 2.0f, default_item->getSize().height / 2.0f)); default_item->addChild(default_button); // set model 將建立的模板設定為專案模板 listView->setItemModel(default_item); // add default item ssize_t count = _array->count(); for (int i = 0; i < count / 4; ++i) { listView->pushBackDefaultItem();//載入預設專案模板5個 } // insert default item for (int i = 0; i < count / 4; ++i) { listView->insertDefaultItem(0);//插入預設模板 } // add custom item //新增自定義模板 for (int i = 0; i < count / 4; ++i) { Button* custom_button = Button::create("button.png", "buttonHighlighted.png"); custom_button->setName("Title Button"); custom_button->setScale9Enabled(true); custom_button->setSize(default_button->getSize()); Layout *custom_item = Layout::create(); custom_item->setSize(custom_button->getSize()); custom_button->setPosition(Vec2(custom_item->getSize().width / 2.0f, custom_item->getSize().height / 2.0f)); custom_item->addChild(custom_button); listView->pushBackCustomItem(custom_item); } // insert custom item 插入自定義模板 Vector<Widget*>& items = listView->getItems(); ssize_t items_count = items.size(); for (int i = 0; i < count / 4; ++i) { Button* custom_button = Button::create("button.png", "buttonHighlighted.png"); custom_button->setName("Title Button"); custom_button->setScale9Enabled(true); custom_button->setSize(default_button->getSize()); Layout *custom_item = Layout::create(); custom_item->setSize(custom_button->getSize()); custom_button->setPosition(Vec2(custom_item->getSize().width / 2.0f, custom_item->getSize().height / 2.0f)); custom_item->addChild(custom_button); listView->insertCustomItem(custom_item, items_count); } // set item data 設定item的標題 items_count = items.size(); for (int i = 0; i < items_count; ++i) { Widget* item = listView->getItem(i); Button* button = static_cast<Button*>(item->getChildByName("Title Button")); ssize_t index = listView->getIndex(item); button->setTitleText(static_cast<__String*>(_array->getObjectAtIndex(index))->getCString()); } // remove last item 刪除最後一個item listView->removeLastItem(); // remove item by index items_count = items.size(); 刪除最後一個item listView->removeItem(items_count - 1); // set all items layout gravity 設定佈局 listView->setGravity(ListView::Gravity::CENTER_VERTICAL); // set items margin listView->setItemsMargin(2.0f); return true; } return false; } //事件分發 void UIListViewTest_Vertical::selectedItemEvent(Ref *pSender, ListView::EventType type) { switch (type) { case cocos2d::ui::ListView::EventType::ON_SELECTED_ITEM_START: { ListView* listView = static_cast<ListView*>(pSender); CC_UNUSED_PARAM(listView); CCLOG("select child start index = %ld", listView->getCurSelectedIndex()); break; } case cocos2d::ui::ListView::EventType::ON_SELECTED_ITEM_END: { ListView* listView = static_cast<ListView*>(pSender); CC_UNUSED_PARAM(listView); CCLOG("select child end index = %ld", listView->getCurSelectedIndex()); break; } default: break; } } // UIListViewTest_Horizontal //分析同上 UIListViewTest_Horizontal::UIListViewTest_Horizontal() : _displayValueLabel(nullptr) , _array(nullptr) { } UIListViewTest_Horizontal::~UIListViewTest_Horizontal() { CC_SAFE_RELEASE(_array); } bool UIListViewTest_Horizontal::init() { if (Scene::init()) { Size widgetSize = Director::getInstance()->getWinSize();//_widget->getSize(); _displayValueLabel = Text::create("Move by horizontal direction", "fonts/Marker Felt.ttf", 32); _displayValueLabel->setAnchorPoint(Vec2(0.5f, -1.0f)); _displayValueLabel->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f + _displayValueLabel->getContentSize().height * 1.5f)); addChild(_displayValueLabel); Text* alert = Text::create("ListView horizontal", "fonts/Marker Felt.ttf", 30); alert->setColor(Color3B(159, 168, 176)); alert->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - alert->getSize().height * 3.075f)); addChild(alert); _array = Array::create(); CC_SAFE_RETAIN(_array); for (int i = 0; i < 20; ++i) { __String* ccstr = __String::createWithFormat("listview_item_%d", i); _array->addObject(ccstr); } // Create the list view ex ListView* listView = ListView::create(); // set list view ex direction listView->setDirection(ui::ScrollView::Direction::HORIZONTAL); listView->setTouchEnabled(true); listView->setBounceEnabled(true); listView->setBackGroundImage(""); listView->setBackGroundImageScale9Enabled(true); listView->setSize(Size(240, 130)); listView->setPosition(Vec2((widgetSize.width / 2.0f + listView->getSize().width) / 2.0f,(widgetSize.height / 2.0f + listView->getSize().height) / 2.0f)); listView->addEventListener(CC_CALLBACK_2(UIListViewTest_Horizontal::selectedItemEvent, this)); addChild(listView); // create model Button* default_button = Button::create("backtotoppressed.png", "backtotopnormal.png"); default_button->setName("Title Button"); Layout *default_item = Layout::create(); default_item->setTouchEnabled(true); default_item->setSize(default_button->getSize()); default_button->setPosition(Vec2(default_item->getSize().width / 2.0f, default_item->getSize().height / 2.0f)); default_item->addChild(default_button); // set model listView->setItemModel(default_item); // add default item ssize_t count = _array->count(); for (int i = 0; i < count / 4; ++i) { listView->pushBackDefaultItem(); } // insert default item for (int i = 0; i < count / 4; ++i) { listView->insertDefaultItem(0); } // add custom item for (int i = 0; i < count / 4; ++i) { Button* custom_button = Button::create("button.png", "buttonHighlighted.png"); custom_button->setName("Title Button"); custom_button->setScale9Enabled(true); custom_button->setSize(default_button->getSize()); Layout* custom_item = Layout::create(); custom_item->setSize(custom_button->getSize()); custom_button->setPosition(Vec2(custom_item->getSize().width / 2.0f, custom_item->getSize().height / 2.0f)); custom_item->addChild(custom_button); listView->pushBackCustomItem(custom_item); } // insert custom item Vector<Widget*>& items = listView->getItems(); ssize_t items_count = items.size(); for (int i = 0; i < count / 4; ++i) { Button* custom_button = Button::create("button.png", "buttonHighlighted.png"); custom_button->setName("Title Button"); custom_button->setScale9Enabled(true); custom_button->setSize(default_button->getSize()); Layout* custom_item = Layout::create(); custom_item->setSize(custom_button->getSize()); custom_button->setPosition(Vec2(custom_item->getSize().width / 2.0f, custom_item->getSize().height / 2.0f)); custom_item->addChild(custom_button); listView->insertCustomItem(custom_item, items_count); } // set item data items_count = items.size(); for (int i = 0; i < items_count; ++i) { Widget *item = listView->getItem(i); Button *button = static_cast<Button*>(item->getChildByName("Title Button")); ssize_t index = listView->getIndex(item); button->setTitleText(static_cast<__String*>(_array->getObjectAtIndex(index))->getCString()); } // remove last item listView->removeLastItem(); // remove item by index items_count = items.size(); listView->removeItem(items_count - 1); // set all items layout gravity listView->setGravity(ListView::Gravity::CENTER_VERTICAL); // set items margin listView->setItemsMargin(2); return true; } return false; } void UIListViewTest_Horizontal::selectedItemEvent(Ref *pSender, ListView::EventType type) { switch (type) { case cocos2d::ui::ListView::EventType::ON_SELECTED_ITEM_START: { ListView* listView = static_cast<ListView*>(pSender); CC_UNUSED_PARAM(listView); CCLOG("select child start index = %ld", listView->getCurSelectedIndex()); break; } case cocos2d::ui::ListView::EventType::ON_SELECTED_ITEM_END: { ListView* listView = static_cast<ListView*>(pSender); CC_UNUSED_PARAM(listView); CCLOG("select child end index = %ld", listView->getCurSelectedIndex()); break; } default: break; } }
原始碼下載