PuzzleSDK
UIListViewTest.cpp
浏览该文件的文档.
1/****************************************************************************
2 Copyright (c) 2017-2018 Xiamen Yaji Software Co., Ltd.
3
4 http://www.cocos2d-x.org
5
6 Permission is hereby granted, free of charge, to any person obtaining a copy
7 of this software and associated documentation files (the "Software"), to deal
8 in the Software without restriction, including without limitation the rights
9 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 copies of the Software, and to permit persons to whom the Software is
11 furnished to do so, subject to the following conditions:
12
13 The above copyright notice and this permission notice shall be included in
14 all copies or substantial portions of the Software.
15
16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 THE SOFTWARE.
23 ****************************************************************************/
24
25#include "UIListViewTest.h"
26
28using namespace cocos2d::ui;
29
30const char* font_UIListViewTest = "fonts/Marker Felt.ttf";
31
32UIListViewTests::UIListViewTests()
33{
44}
45
46// UIListViewTest_Vertical
47
49{
50}
51
53{
54}
55
57{
58 if (UIScene::init())
59 {
60 Size widgetSize = _widget->getContentSize();
61
62 _displayValueLabel = Text::create("There are 50 items, but we only create 5 templates", "fonts/Marker Felt.ttf", 20);
63 _displayValueLabel->setAnchorPoint(Vec2(0.5f, -1.0f));
64 _displayValueLabel->setPosition(Vec2(widgetSize.width / 2.0f,
65 widgetSize.height / 2.0f + _displayValueLabel->getContentSize().height * 1.5f + 30));
67
68
69 Text* alert = Text::create("ListView vertical", "fonts/Marker Felt.ttf", 30);
70 alert->setColor(Color3B(159, 168, 176));
71 alert->setPosition(Vec2(widgetSize.width / 2.0f,
72 widgetSize.height / 2.0f - alert->getContentSize().height * 3.075f));
73 _uiLayer->addChild(alert);
74
75 Layout* root = static_cast<Layout*>(_uiLayer->getChildByTag(81));
76
77 Layout* background = dynamic_cast<Layout*>(root->getChildByName("background_Panel"));
78 Size backgroundSize = background->getContentSize();
79
80
81 // create list view ex data
82
83 for (int i = 0; i < _totalCount; ++i)
84 {
85 std::string ccstr = StringUtils::format("listview_item_%d", i);
86 _array.push_back(ccstr);
87 }
88
89
90 // Create the list view ex
91 _listView = ListView::create();
92 // set list view ex direction
93 _listView->setDirection(ui::ScrollView::Direction::VERTICAL);
94 _listView->setBounceEnabled(true);
95 _listView->setBackGroundImage("cocosui/green_edit.png");
96 _listView->setGlobalZOrder(200);
97 _listView->setBackGroundImageScale9Enabled(true);
98 _listView->setContentSize(Size(240.0f, 130.0f));
99 _listView->setPosition(Vec2((widgetSize - _listView->getContentSize()) / 2.0f));
100 _listView->addEventListener((ui::ListView::ccListViewCallback)CC_CALLBACK_2(UIListViewTest_Vertical::selectedItemEvent, this));
101 _listView->addEventListener((ui::ListView::ccScrollViewCallback)CC_CALLBACK_2(UIListViewTest_Vertical::selectedItemEventScrollView,this));
102 _listView->setScrollBarPositionFromCorner(Vec2(7, 7));
103 _uiLayer->addChild(_listView);
104
105
106 // create model
107 Button* default_button = Button::create("cocosui/backtotoppressed.png", "cocosui/backtotopnormal.png");
108 default_button->setName("Title Button");
109
110 Layout* default_item = Layout::create();
111 default_item->setTouchEnabled(true);
112 default_item->setContentSize(default_button->getContentSize());
113 default_button->setPosition(Vec2(default_item->getContentSize() / 2.0f));
114 default_item->addChild(default_button);
115
116 auto clippingNode = ClippingNode::create();
117 auto sprite = Sprite::create("cocosui/clippingHead.jpg");
118 clippingNode->addChild(sprite);
119 auto stencil = Sprite::create("cocosui/clippingStencil.jpg");
120 clippingNode->setStencil(stencil);
121 auto custom_item_contentSize = default_item->getContentSize();
122 clippingNode->setPosition(sprite->getContentSize().width/2,
123 custom_item_contentSize.height/2);
124 clippingNode->setScale(0.5);
125 default_item->addChild(clippingNode);
126
127 // set model
128 _listView->setItemModel(default_item);
129
130 // set all items layout gravity
131 _listView->setGravity(ListView::Gravity::CENTER_VERTICAL);
132
133 //initial the data
134 for (int i = 0; i < _totalCount; ++i) {
135 if (i < _spawnCount) {
136 Widget* item = default_item->clone();
137 item->setTag(i);
138 Button* btn = (Button*)item->getChildByName("Title Button");
139 btn->setTitleText(_array.at(i));
140 _listView->pushBackCustomItem(item);
141 }
142 }
143
144 // set items margin
145 float spacing = 4;
146 _listView->setItemsMargin(spacing);
147 _itemTemplateHeight = default_item->getContentSize().height;
149
150 //update listview data
151 this->scheduleUpdate();
152
153 _listView->forceDoLayout();
154 float totalHeight = _itemTemplateHeight * _totalCount + (_totalCount - 1) * spacing;
155 _listView->setInnerContainerSize(Size(_listView->getInnerContainerSize().width, totalHeight));
156 _listView->jumpToTop();
157
158
159 // Show the indexes of items on each boundary.
160 {
161 float position = 75;
162 // Labels
163 _indexLabels[0] = Text::create(" ", "fonts/Marker Felt.ttf", 12);
164 _indexLabels[0]->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
165 _indexLabels[0]->setPosition(_uiLayer->getContentSize() / 2 + Size(0.0f, position));
166 _uiLayer->addChild(_indexLabels[0]);
167 _indexLabels[1] = Text::create(" ", "fonts/Marker Felt.ttf", 12);
168 _indexLabels[1]->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
169 _indexLabels[1]->setPosition(_uiLayer->getContentSize() / 2 + Size(140.0f, 0.0f));
170 _uiLayer->addChild(_indexLabels[1]);
171 _indexLabels[2] = Text::create(" ", "fonts/Marker Felt.ttf", 12);
172 _indexLabels[2]->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
173 _indexLabels[2]->setPosition(_uiLayer->getContentSize() / 2 + Size(0.0f, -position));
174 _uiLayer->addChild(_indexLabels[2]);
175
176 // Callback
177 _listView->ScrollView::addEventListener([this](Ref* ref, ScrollView::EventType eventType) {
178 ListView* listView = dynamic_cast<ListView*>(ref);
179 if(listView == nullptr || eventType != ScrollView::EventType::CONTAINER_MOVED)
180 {
181 return;
182 }
183 auto bottom = listView->getBottommostItemInCurrentView();
184 auto center = listView->getCenterItemInCurrentView();
185 auto top = listView->getTopmostItemInCurrentView();
186
187 _indexLabels[0]->setString(StringUtils::format("Top index=%zd", listView->getIndex(top)));
188 _indexLabels[1]->setString(StringUtils::format("Center\nindex=%zd", listView->getIndex(center)));
189 _indexLabels[2]->setString(StringUtils::format("Bottom index=%zd", listView->getIndex(bottom)));
190 });
191 }
192
193 return true;
194 }
195
196 return false;
197}
198
199float UIListViewTest_Vertical::getItemPositionYInView(cocos2d::ui::Widget *item) const
200{
201 auto worldPos = item->getParent()->convertToWorldSpaceAR(item->getPosition());
202 auto viewPos = this->_listView->convertToNodeSpaceAR(worldPos);
203 return viewPos.y;
204}
205
206void UIListViewTest_Vertical::updateItem(int itemID, int templateID)
207{
208 auto itemTemplate = _listView->getItems().at(templateID);
209 Button* btn = (Button*)itemTemplate->getChildByName("Title Button");
210 //If you have the item ID and templateID, you could fill in the data here
211 itemTemplate->setTag(itemID);
212 btn->setTitleText(_array.at(itemID));
213}
214
216{
217 this->_updateTimer += dt;
218 if (this->_updateTimer < this->_updateInterval) {
219 return;
220 }
221
222 float totalHeight = _itemTemplateHeight * _totalCount + (_totalCount - 1) * 4;
223
224 auto listViewHeight = _listView->getContentSize().height;
225
226 this->_updateTimer = 0;
227 auto isDown = this->_listView->getInnerContainerPosition().y < this->_lastContentPosY;
228 auto items = _listView->getItems();
229
230 for (int i = 0; i < _spawnCount && i < _totalCount; ++i) {
231 auto item = items.at(i);
232 auto itemPos = this->getItemPositionYInView(item);
233 if (isDown) {
234 if (itemPos < -_bufferZone && item->getPosition().y + _reuseItemOffset < totalHeight) {
235 int itemID = item->getTag() - (int)items.size();
236 item->setPositionY(item->getPositionY() + _reuseItemOffset);
237 CCLOG("itemPos = %f, itemID = %d, templateID = %d", itemPos, itemID, i);
238 this->updateItem(itemID, i);
239 }
240 }
241 else {
242 if (itemPos > _bufferZone + listViewHeight &&
243 item->getPosition().y - _reuseItemOffset >= 0) {
244
245 item->setPositionY(item->getPositionY() - _reuseItemOffset);
246 int itemID = item->getTag() + (int)items.size();
247 CCLOG("itemPos = %f, itemID = %d, templateID = %d", itemPos, itemID, i);
248 this->updateItem(itemID, i);
249 }
250 }
251 }
252 //update ListView Items
253 this->_lastContentPosY = this->_listView->getInnerContainer()->getPosition().y;
254}
255
256void UIListViewTest_Vertical::selectedItemEvent(Ref *pSender, ListView::EventType type)
257{
258 switch (type)
259 {
260 case cocos2d::ui::ListView::EventType::ON_SELECTED_ITEM_START:
261 {
262 ListView* listView = static_cast<ListView*>(pSender);
263 auto item = listView->getItem(listView->getCurSelectedIndex());
264 log("select child start index = %d", item->getTag());
265 break;
266 }
267 case cocos2d::ui::ListView::EventType::ON_SELECTED_ITEM_END:
268 {
269 ListView* listView = static_cast<ListView*>(pSender);
270 auto item = listView->getItem(listView->getCurSelectedIndex());
271 log("select child end index = %d", item->getTag());
272 break;
273 }
274 default:
275 break;
276 }
277}
278
279void UIListViewTest_Vertical::selectedItemEventScrollView(Ref* pSender, ui::ScrollView::EventType type)
280{
281 switch (type) {
282 case ui::ScrollView::EventType::SCROLL_TO_BOTTOM:
283 CCLOG("SCROLL_TO_BOTTOM");
284 break;
285 case ui::ScrollView::EventType::SCROLL_TO_TOP:
286 CCLOG("SCROLL_TO_TOP");
287 break;
288 default:
289 break;
290 }
291}
292
293
294// UIListViewTest_Horizontal
295
297{
298}
299
301{
302}
303
305{
306 if (UIScene::init())
307 {
308 Size widgetSize = _widget->getContentSize();
309
310 _displayValueLabel = Text::create("There are 50 items, but we only create 5 templates",
311 "fonts/Marker Felt.ttf",
312 20);
313
314 _displayValueLabel->setAnchorPoint(Vec2(0.5f, -1.0f));
315 _displayValueLabel->setPosition(Vec2(widgetSize.width / 2.0f,
316 widgetSize.height / 2.0f
317 + _displayValueLabel->getContentSize().height * 2 + 20));
318
319 _uiLayer->addChild(_displayValueLabel);
320
321
322 Text* alert = Text::create("ListView horizontal", "fonts/Marker Felt.ttf", 30);
323 alert->setColor(Color3B(159, 168, 176));
324 alert->setPosition(Vec2(widgetSize.width / 2.0f,
325 widgetSize.height / 2.0f - alert->getContentSize().height * 3.075f));
326 _uiLayer->addChild(alert);
327
328 Layout* root = static_cast<Layout*>(_uiLayer->getChildByTag(81));
329
330 Layout* background = static_cast<Layout*>(root->getChildByName("background_Panel"));
331 Size backgroundSize = background->getContentSize();
332
333
334 // create listview data
335 //The data is usually fetch from the server
336 for (int i = 0; i < _totalCount; ++i)
337 {
338 std::string ccstr = StringUtils::format("listview_item_%d", i);
339 _array.push_back(ccstr);
340 }
341
342
343 // Create the list view ex
344 _listView = ListView::create();
345 // set list view ex direction
346 _listView->setDirection(ui::ScrollView::Direction::HORIZONTAL);
347 _listView->setTouchEnabled(true);
348 _listView->setBounceEnabled(true);
349 _listView->setBackGroundImage("cocosui/green_edit.png");
350 _listView->setBackGroundImageScale9Enabled(true);
351 _listView->setContentSize(Size(240.0f, 130.0f));
352 _listView->setPosition(Vec2((widgetSize.width - backgroundSize.width) / 2.0f +
353 (backgroundSize.width - _listView->getContentSize().width) / 2.0f,
354 (widgetSize.height - backgroundSize.height) / 2.0f +
355 (backgroundSize.height - _listView->getContentSize().height) / 2.0f));
356 _listView->addEventListener((ui::ListView::ccListViewCallback)CC_CALLBACK_2(UIListViewTest_Horizontal::selectedItemEvent, this));
357 _listView->setScrollBarPositionFromCorner(Vec2(7, 7));
358 _uiLayer->addChild(_listView);
359
360
361 // create model
362 Button* default_button = Button::create("cocosui/backtotoppressed.png",
363 "cocosui/backtotopnormal.png");
364 default_button->setName("Title Button");
365
366 Layout *default_item = Layout::create();
367 default_item->setTouchEnabled(true);
368 default_item->setContentSize(default_button->getContentSize());
369 default_button->setPosition(Vec2(default_item->getContentSize().width / 2.0f,
370 default_item->getContentSize().height / 2.0f));
371 default_item->addChild(default_button);
372
373 // set model
374 _listView->setItemModel(default_item);
375
376 // set all items layout gravity
377 _listView->setGravity(ListView::Gravity::CENTER_VERTICAL);
378
379 //initial the data
380 for (int i = 0; i < _totalCount; ++i) {
381 if (i < _spawnCount) {
382 Widget* item = default_item->clone();
383 item->setTag(i);
384 Button* btn = (Button*)item->getChildByName("Title Button");
385 btn->setTitleText(_array.at(i));
386 _listView->pushBackCustomItem(item);
387 }
388 }
389
390 // set items margin
391 float spacing = 4;
392 _listView->setItemsMargin(spacing);
393 _itemTemplateWidth = default_item->getContentSize().width;
394 this->_reuseItemOffset = (_itemTemplateWidth + spacing) * _spawnCount;
395
396 _listView->forceDoLayout();
397 float totalWidth = _itemTemplateWidth * _totalCount + (_totalCount - 1) * 4;
398 _listView->getInnerContainer()->setContentSize(Size(totalWidth, _listView->getInnerContainerSize().height));
399
400 //update listview data
401 this->scheduleUpdate();
402
403 return true;
404 }
405
406 return false;
407}
408
409float UIListViewTest_Horizontal::getItemPositionXInView(cocos2d::ui::Widget *item) const
410{
411 auto worldPos = item->getParent()->convertToWorldSpaceAR(item->getPosition());
412 auto viewPos = this->_listView->convertToNodeSpaceAR(worldPos);
413 return viewPos.x;
414}
415
416void UIListViewTest_Horizontal::updateItem(int itemID, int templateID)
417{
418 auto itemTemplate = _listView->getItems().at(templateID);
419 Button* btn = (Button*)itemTemplate->getChildByName("Title Button");
420 //If you have the item ID and templateID, you could fill in the data here
421 itemTemplate->setTag(itemID);
422 btn->setTitleText(_array.at(itemID));
423}
424
426{
427 this->_updateTimer += dt;
428 if (this->_updateTimer < this->_updateInterval) {
429 return;
430 }
431 float totalWidth = _itemTemplateWidth * _totalCount + (_totalCount - 1) * 4;
432
433 this->_updateTimer = 0;
434 auto isRight = this->_listView->getInnerContainer()->getPosition().x < this->_lastContentPosX;
435 auto items = _listView->getItems();
436
437 for (int i = 0; i < _spawnCount && i < _totalCount; ++i) {
438 auto item = items.at(i);
439 auto itemPos = this->getItemPositionXInView(item);
440 if (isRight) {
441 if (itemPos < -_bufferZone && item->getPosition().x + _reuseItemOffset < totalWidth) {
442 int itemID = item->getTag() + (int)items.size();
443 item->setPositionX(item->getPositionX() + _reuseItemOffset);
444 CCLOG("itemPos = %f, itemID = %d, templateID = %d", itemPos, itemID, i);
445 this->updateItem(itemID, i);
446 }
447 }
448 else {
449 if (itemPos > _bufferZone + _listView->getContentSize().width &&
450 item->getPosition().x - _reuseItemOffset >= 0) {
451
452 item->setPositionX(item->getPositionX() - _reuseItemOffset);
453 int itemID = item->getTag() - (int)items.size();
454 CCLOG("itemPos = %f, itemID = %d, templateID = %d", itemPos, itemID, i);
455 this->updateItem(itemID, i);
456 }
457 }
458 }
459 //update ListView Items
460 this->_lastContentPosX = this->_listView->getInnerContainer()->getPosition().x;
461}
462
463void UIListViewTest_Horizontal::selectedItemEvent(Ref *pSender, ListView::EventType type)
464{
465 switch (type)
466 {
467 case cocos2d::ui::ListView::EventType::ON_SELECTED_ITEM_START:
468 {
469 ListView* listView = static_cast<ListView*>(pSender);
470 auto item = listView->getItem(listView->getCurSelectedIndex());
471 log("select child start index = %d", item->getTag());
472 break;
473 }
474 case cocos2d::ui::ListView::EventType::ON_SELECTED_ITEM_END:
475 {
476 ListView* listView = static_cast<ListView*>(pSender);
477 auto item = listView->getItem(listView->getCurSelectedIndex());
478 log("select child end index = %d", item->getTag());
479 break;
480 }
481 default:
482 break;
483 }
484}
485
487{
488 if (UIScene::init())
489 {
490 Size widgetSize = _widget->getContentSize();
491
492 auto label = Text::create("Issue 12692", "fonts/Marker Felt.ttf", 32);
493 label->setName("Text Title");
494 label->setAnchorPoint(Vec2(0.5f, -1.0f));
495 label->setPosition(Vec2(widgetSize.width / 2.0f,
496 widgetSize.height / 2.0f + label->getContentSize().height * 1.5f));
497 _uiLayer->addChild(label);
498
499
500 Text* alert = Text::create("ListView in ListView enable Scissor Clipping", "fonts/Marker Felt.ttf", 20);
501 alert->setName("Text Alert");
502 alert->setColor(Color3B(159, 168, 176));
503 alert->setPosition(Vec2(widgetSize.width / 2.0f,
504 widgetSize.height / 2.0f - alert->getContentSize().height * 3.075f));
505 _uiLayer->addChild(alert);
506
507 Layout* root = static_cast<Layout*>(_uiLayer->getChildByTag(81));
508
509 Layout* background = dynamic_cast<Layout*>(root->getChildByName("background_Panel"));
510 Size backgroundSize = background->getContentSize();
511
512 // Create the list view ex
513 ListView* listView = ListView::create();
514 // set list view ex direction
515 listView->setDirection(ui::ScrollView::Direction::VERTICAL);
516 listView->setBounceEnabled(true);
517 listView->setBackGroundImage("cocosui/green_edit.png");
518 listView->setBackGroundImageScale9Enabled(true);
519 listView->setContentSize(Size(240.0f, 130.0f));
520 listView->setPosition(Vec2((widgetSize.width - backgroundSize.width) / 2.0f +
521 (backgroundSize.width - listView->getContentSize().width) / 2.0f,
522 (widgetSize.height - backgroundSize.height) / 2.0f +
523 (backgroundSize.height - listView->getContentSize().height) / 2.0f));
524 listView->setScrollBarPositionFromCorner(Vec2(7, 7));
525 listView->setClippingEnabled(true);
526 listView->setClippingType(ui::Layout::ClippingType::SCISSOR);
527 listView->setName("listview1");
528 _uiLayer->addChild(listView);
529
530 auto list2 = ListView::create();
531 list2->setDirection(ui::ScrollView::Direction::VERTICAL);
532 list2->setBounceEnabled(true);
533 list2->setBackGroundImage("cocosui/green_edit.png");
534 list2->setBackGroundImageScale9Enabled(true);
535 list2->setContentSize(Size(240, 65));
536 list2->setClippingEnabled(true);
537 list2->setClippingType(ui::Layout::ClippingType::SCISSOR);
538 list2->setName("listview2");
539 listView->insertCustomItem(list2, 0);
540
541 {
542 Button* default_button = Button::create("cocosui/backtotoppressed.png", "cocosui/backtotopnormal.png");
543 default_button->setName("Title Button");
544
545 Layout* default_item = Layout::create();
546 default_item->setTouchEnabled(true);
547 default_item->setContentSize(default_button->getContentSize());
548 default_button->setPosition(Vec2(default_item->getContentSize().width / 2.0f,
549 default_item->getContentSize().height / 2.0f));
550 default_item->addChild(default_button);
551
552 // set model
553 listView->setItemModel(default_item);
554 listView->pushBackDefaultItem();
555 listView->pushBackDefaultItem();
556 listView->pushBackDefaultItem();
557 }
558 {
559 Button* default_button = Button::create("cocosui/backtotoppressed.png", "cocosui/backtotopnormal.png");
560 default_button->setName("Title Button 2");
561
562 Layout* default_item = Layout::create();
563 default_item->setTouchEnabled(true);
564 default_item->setContentSize(default_button->getContentSize());
565 default_button->setPosition(Vec2(default_item->getContentSize().width / 2.0f,
566 default_item->getContentSize().height / 2.0f));
567 default_item->addChild(default_button);
568
569 // set model
570 list2->setItemModel(default_item);
571 list2->pushBackDefaultItem();
572 list2->pushBackDefaultItem();
573 list2->pushBackDefaultItem();
574 }
575 return true;
576 }
577
578 return false;
579}
580
581
583{
584 if (UIScene::init())
585 {
586 Size widgetSize = _widget->getContentSize();
587
588 auto label = Text::create("Issue 8316", "fonts/Marker Felt.ttf", 32);
589 label->setAnchorPoint(Vec2(0.5f, -1.0f));
590 label->setPosition(Vec2(widgetSize.width / 2.0f,
591 widgetSize.height / 2.0f + label->getContentSize().height * 1.5f));
592 _uiLayer->addChild(label);
593
594 Text* alert = Text::create("Can not scroll list view", "fonts/Marker Felt.ttf", 20);
595 alert->setColor(Color3B(159, 168, 176));
596 alert->setPosition(Vec2(widgetSize.width / 2.0f,
597 widgetSize.height / 2.0f - alert->getContentSize().height * 3.075f));
598 _uiLayer->addChild(alert);
599
600 Layout* root = static_cast<Layout*>(_uiLayer->getChildByTag(81));
601
602 Layout* background = dynamic_cast<Layout*>(root->getChildByName("background_Panel"));
603 Size backgroundSize = background->getContentSize();
604
605 // Create the list view ex
606 ListView* listView = ListView::create();
607 // set list view ex direction
608 listView->setDirection(ui::ScrollView::Direction::VERTICAL);
609 listView->setBounceEnabled(true);
610 listView->setTouchEnabled(false);
611 listView->setBackGroundImage("cocosui/green_edit.png");
612 listView->setBackGroundImageScale9Enabled(true);
613 listView->setContentSize(Size(240.0f, 130.0f));
614 listView->setPosition(Vec2((widgetSize.width - backgroundSize.width) / 2.0f +
615 (backgroundSize.width - listView->getContentSize().width) / 2.0f,
616 (widgetSize.height - backgroundSize.height) / 2.0f +
617 (backgroundSize.height - listView->getContentSize().height) / 2.0f));
618 listView->setScrollBarPositionFromCorner(Vec2(7, 7));
619 listView->setClippingEnabled(true);
620 listView->setClippingType(ui::Layout::ClippingType::SCISSOR);
621 listView->setName("listview1");
622
623 {
624 Button* default_button = Button::create("cocosui/backtotoppressed.png", "cocosui/backtotopnormal.png");
625 default_button->setName("Title Button");
626
627 Layout* default_item = Layout::create();
628 default_item->setTouchEnabled(true);
629 default_item->setContentSize(default_button->getContentSize());
630 default_button->setPosition(Vec2(default_item->getContentSize().width / 2.0f,
631 default_item->getContentSize().height / 2.0f));
632 default_item->addChild(default_button);
633
634 // set model
635 listView->setItemModel(default_item);
636 listView->pushBackDefaultItem();
637 listView->pushBackDefaultItem();
638 listView->pushBackDefaultItem();
639 }
640
641 _uiLayer->addChild(listView);
642
643
644 return true;
645 }
646
647 return false;
648}
649
650
651// UIListViewTest_ScrollToItem
653{
654 if(!UIScene::init())
655 {
656 return false;
657 }
658
659 Size layerSize = _uiLayer->getContentSize();
660
661 static int NUMBER_OF_ITEMS = 31;
662 _nextIndex = 0;
663 _titleLabel = Text::create("Scroll to item", "fonts/Marker Felt.ttf", 32);
664 _titleLabel->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
665 _titleLabel->setPosition(Vec2(layerSize / 2) + Vec2(0.0f, _titleLabel->getContentSize().height * 3.15f));
666 _uiLayer->addChild(_titleLabel, 3);
667
668 // Create the list view
669 _listView = ListView::create();
670 _listView->setDirection(getListViewDirection());
671 _listView->setBounceEnabled(true);
672 _listView->setBackGroundImage("cocosui/green_edit.png");
673 _listView->setBackGroundImageScale9Enabled(true);
674 _listView->setContentSize(layerSize / 2);
675 _listView->setScrollBarPositionFromCorner(Vec2(7, 7));
676 _listView->setItemsMargin(2.0f);
677 _listView->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
678 _listView->setPosition(layerSize / 2);
679 _uiLayer->addChild(_listView);
680
681 // Guide line for center align
682 {
683 DrawNode* pNode = DrawNode::create();
684 Vec2 center = layerSize / 2;
685 if(getListViewDirection() == ScrollView::Direction::HORIZONTAL)
686 {
687 float halfY = 110;
688 pNode->drawLine(Vec2(center.x, center.y - halfY), Vec2(center.x, center.y + halfY), Color4F(0, 0, 0, 1));
689 }
690 else
691 {
692 float halfX = 150;
693 pNode->drawLine(Vec2(center.x - halfX, center.y), Vec2(center.x + halfX, center.y), Color4F(0, 0, 0, 1));
694 }
695 pNode->setLineWidth(2);
696 _uiLayer->addChild(pNode);
697 }
698
699 // Button
700 auto pButton = Button::create("cocosui/backtotoppressed.png", "cocosui/backtotopnormal.png");
701 pButton->setAnchorPoint(Vec2::ANCHOR_MIDDLE_LEFT);
702 pButton->setScale(0.8f);
703 pButton->setPosition(Vec2(layerSize / 2) + Vec2(120.0f, -60.0f));
704 pButton->setTitleText(StringUtils::format("Go to '%d'", _nextIndex));
705 pButton->addClickEventListener([this, pButton](Ref*) {
706 _listView->scrollToItem(_nextIndex, Vec2::ANCHOR_MIDDLE, Vec2::ANCHOR_MIDDLE);
707 _nextIndex = (_nextIndex + (NUMBER_OF_ITEMS / 2)) % NUMBER_OF_ITEMS;
708 pButton->setTitleText(StringUtils::format("Go to '%d'", _nextIndex));
709 });
710 _uiLayer->addChild(pButton);
711
712 // Add list items
713 static const Size BUTTON_SIZE(50, 40);
714 for (int i = 0; i < NUMBER_OF_ITEMS; ++i)
715 {
716 auto pButton = Button::create("cocosui/button.png", "cocosui/buttonHighlighted.png");
717 pButton->setContentSize(BUTTON_SIZE);
718 pButton->setScale9Enabled(true);
719 pButton->setTitleText(StringUtils::format("Button-%d", i));
720 _listView->pushBackCustomItem(pButton);
721 }
722 return true;
723}
724
725
726
727// UIListViewTest_Magnetic
729{
730 if(!UIScene::init())
731 {
732 return false;
733 }
734
735 Size layerSize = _uiLayer->getContentSize();
736
737 _titleLabel = Text::create("Magnetic scroll", "fonts/Marker Felt.ttf", 32);
738 _titleLabel->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
739 _titleLabel->setPosition(Vec2(layerSize / 2) + Vec2(0.0f, _titleLabel->getContentSize().height * 3.15f));
740 _uiLayer->addChild(_titleLabel, 3);
741
742 // Create the list view
743 _listView = ListView::create();
744 _listView->setDirection(getListViewDirection());
745 _listView->setBounceEnabled(true);
746 _listView->setBackGroundImage("cocosui/green_edit.png");
747 _listView->setBackGroundImageScale9Enabled(true);
748 _listView->setContentSize(layerSize / 2);
749 _listView->setScrollBarPositionFromCorner(Vec2(7, 7));
750 _listView->setItemsMargin(2.0f);
751 _listView->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
752 _listView->setPosition(layerSize / 2);
753 _uiLayer->addChild(_listView);
754
755 // Guide line for center align
756 {
757 DrawNode* pNode = DrawNode::create();
758 Vec2 center = layerSize / 2;
759 if(getListViewDirection() == ScrollView::Direction::HORIZONTAL)
760 {
761 float halfY = 110;
762 pNode->drawLine(Vec2(center.x, center.y - halfY), Vec2(center.x, center.y + halfY), Color4F(0, 0, 0, 1));
763 }
764 else
765 {
766 float halfX = 150;
767 pNode->drawLine(Vec2(center.x - halfX, center.y), Vec2(center.x + halfX, center.y), Color4F(0, 0, 0, 1));
768 }
769 pNode->setLineWidth(2);
770 _uiLayer->addChild(pNode);
771 }
772
773 // Show the indexes of items on each boundary.
774 {
775 for(int i = 0; i < 5; ++i)
776 {
777 _indexLabels[i] = Text::create(" ", "fonts/Marker Felt.ttf", 12);
778 _indexLabels[i]->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
779 _uiLayer->addChild(_indexLabels[i]);
780 }
781 float deltaX = 145, deltaY = 90;
782 _indexLabels[0]->setPosition(_uiLayer->getContentSize() / 2 + Size(-deltaX, 0.0f)); // left
783 _indexLabels[1]->setPosition(_uiLayer->getContentSize() / 2 + Size(deltaX, 0.0f)); // right
784 _indexLabels[2]->setPosition(_uiLayer->getContentSize() / 2 + Size(0.0f, deltaY)); // top
785 _indexLabels[3]->setPosition(_uiLayer->getContentSize() / 2 + Size(0.0f, -deltaY)); // bottom
786 _indexLabels[4]->setPosition(_uiLayer->getContentSize() / 2 + Size(deltaX, deltaY)); // center
787
788 // Callback
789 _listView->ScrollView::addEventListener([this](Ref* ref, ScrollView::EventType eventType) {
790 ListView* listView = dynamic_cast<ListView*>(ref);
791 if(listView == nullptr || eventType != ScrollView::EventType::CONTAINER_MOVED)
792 {
793 return;
794 }
795 auto left = listView->getLeftmostItemInCurrentView();
796 auto right = listView->getRightmostItemInCurrentView();
797 auto top = listView->getTopmostItemInCurrentView();
798 auto bottom = listView->getBottommostItemInCurrentView();
799 auto center = listView->getCenterItemInCurrentView();
800
801 _indexLabels[0]->setString(StringUtils::format("Left\nindex=%zd", listView->getIndex(left)));
802 _indexLabels[1]->setString(StringUtils::format("RIght\nindex=%zd", listView->getIndex(right)));
803 _indexLabels[2]->setString(StringUtils::format("Top index=%zd", listView->getIndex(top)));
804 _indexLabels[3]->setString(StringUtils::format("Bottom index=%zd", listView->getIndex(bottom)));
805 _indexLabels[4]->setString(StringUtils::format("Center\nindex=%zd", listView->getIndex(center)));
806 });
807 }
808
809 // Initial magnetic type
810 _listView->setMagneticType(ListView::MagneticType::NONE);
811 _titleLabel->setString("MagneticType - NONE");
812
813 // Magnetic change button
814 auto pButton = Button::create("cocosui/backtotoppressed.png", "cocosui/backtotopnormal.png");
815 pButton->setAnchorPoint(Vec2::ANCHOR_MIDDLE_LEFT);
816 pButton->setScale(0.8f);
817 pButton->setPosition(Vec2(layerSize / 2) + Vec2(130.0f, -60.0f));
818 pButton->setTitleText("Next Magnetic");
819 pButton->addClickEventListener([this](Ref*) {
820 ListView::MagneticType eCurrentType = _listView->getMagneticType();
821 ListView::MagneticType eNextType = ListView::MagneticType::NONE;
822 std::string sString;
823 if(eCurrentType == ListView::MagneticType::NONE)
824 {
825 eNextType = ListView::MagneticType::CENTER;
826 sString = "CENTER";
827 }
828 else if(eCurrentType == ListView::MagneticType::CENTER)
829 {
830 eNextType = ListView::MagneticType::BOTH_END;
831 sString = "BOTH_END";
832 }
833 else if(eCurrentType == ListView::MagneticType::BOTH_END)
834 {
835 if(getListViewDirection() == ScrollView::Direction::HORIZONTAL)
836 {
837 eNextType = ListView::MagneticType::LEFT;
838 sString = "LEFT";
839 }
840 else
841 {
842 eNextType = ListView::MagneticType::TOP;
843 sString = "TOP";
844 }
845 }
846 else if(eCurrentType == ListView::MagneticType::LEFT)
847 {
848 eNextType = ListView::MagneticType::RIGHT;
849 sString = "RIGHT";
850 }
851 else if(eCurrentType == ListView::MagneticType::RIGHT)
852 {
853 eNextType = ListView::MagneticType::NONE;
854 sString = "NONE";
855 }
856 else if(eCurrentType == ListView::MagneticType::TOP)
857 {
858 eNextType = ListView::MagneticType::BOTTOM;
859 sString = "BOTTOM";
860 }
861 else if(eCurrentType == ListView::MagneticType::BOTTOM)
862 {
863 eNextType = ListView::MagneticType::NONE;
864 sString = "NONE";
865 }
866 _listView->setMagneticType(eNextType);
867 _titleLabel->setString(StringUtils::format("MagneticType - %s", sString.c_str()));
868 });
869 _uiLayer->addChild(pButton);
870
871 // Add list items
872 static const Size BUTTON_SIZE(100, 70);
873 for (int i = 0; i < 40; ++i)
874 {
875 auto pButton = Button::create("cocosui/button.png", "cocosui/buttonHighlighted.png");
876 pButton->setContentSize(BUTTON_SIZE);
877 pButton->setScale9Enabled(true);
878 pButton->setTitleText(StringUtils::format("Button-%d", i));
879 _listView->pushBackCustomItem(pButton);
880 }
881 return true;
882}
883
884
885
886// UIListViewTest_Padding
888{
889 if(!UIScene::init())
890 {
891 return false;
892 }
893
894 Size layerSize = _uiLayer->getContentSize();
895
896 _titleLabel = Text::create("Set Padding", "fonts/Marker Felt.ttf", 32);
897 _titleLabel->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
898 _titleLabel->setPosition(Vec2(layerSize / 2) + Vec2(0.0f, _titleLabel->getContentSize().height * 3.15f));
899 _uiLayer->addChild(_titleLabel, 3);
900
901 // Create the list view
902 _listView = ListView::create();
903 _listView->setDirection(getListViewDirection());
904 _listView->setBounceEnabled(true);
905 _listView->setBackGroundImage("cocosui/green_edit.png");
906 _listView->setBackGroundImageScale9Enabled(true);
907 _listView->setContentSize(layerSize / 2);
908 _listView->setScrollBarPositionFromCorner(Vec2(7, 7));
909 _listView->setItemsMargin(2.0f);
910 _listView->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
911 _listView->setGravity(ListView::Gravity::TOP);
912 _listView->setPosition(layerSize / 2);
913 _uiLayer->addChild(_listView);
914
915
916 // Guide line for center align
917 {
918 DrawNode* pNode = DrawNode::create();
919 Vec2 center = layerSize / 2;
920 if(getListViewDirection() == ScrollView::Direction::HORIZONTAL)
921 {
922 float halfY = 110;
923 pNode->drawLine(Vec2(center.x, center.y - halfY), Vec2(center.x, center.y + halfY), Color4F(0, 0, 0, 1));
924 }
925 else
926 {
927 float halfX = 150;
928 pNode->drawLine(Vec2(center.x - halfX, center.y), Vec2(center.x + halfX, center.y), Color4F(0, 0, 0, 1));
929 }
930 pNode->setLineWidth(2);
931 _uiLayer->addChild(pNode);
932 }
933
934 // Slider for setting padding
935 {
936 auto title = Text::create("Padding", "fonts/Marker Felt.ttf", 14);
937 title->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
938 title->setPosition(Vec2(30.0f, 170.0f));
939 _uiLayer->addChild(title);
940 for (int i = 0; i < 4; ++i)
941 {
942 auto slider = Slider::create();
943 slider->loadBarTexture("cocosui/sliderTrack.png");
944 slider->loadSlidBallTextures("cocosui/sliderThumb.png", "cocosui/sliderThumb.png", "");
945 slider->loadProgressBarTexture("cocosui/sliderProgress.png");
946 slider->setScale9Enabled(true);
947 slider->setCapInsets(Rect(0.0f, 0.0f, 0.0f, 0.0f));
948 slider->setContentSize(Size(30.0f, 10.0f));
949 slider->setPosition(Vec2(60.0f, 150.0f - (25 * i)));
950 slider->addEventListener(CC_CALLBACK_2(UIListViewTest_Padding::sliderEvent, this));
951 slider->setTag(i);
952 _uiLayer->addChild(slider);
953
954 std::string str;
955 if (i == 0) str = "Left";
956 else if (i == 1) str = "Top";
957 else if (i == 2) str = "Right";
958 else if (i == 3) str = "Bottom";
959
960 // Show title of slider
961 {
962 auto text = Text::create(str, "fonts/Marker Felt.ttf", 12);
963 text->setAnchorPoint(Vec2::ANCHOR_MIDDLE_LEFT);
964 text->setPosition(Vec2(3, 150 - (25 * i)));
965 _uiLayer->addChild(text);
966 }
967 // Show value of paddings
968 {
969 auto text = Text::create(str + "\nPadding=0", "fonts/Marker Felt.ttf", 12);
970 text->setAnchorPoint(Vec2::ANCHOR_MIDDLE_LEFT);
971 text->setPosition(Vec2(layerSize.width - 65, 200.0f - (40 * i)));
972 _uiLayer->addChild(text);
973
974 _paddingLabels[i] = text;
975 }
976 }
977 }
978
979 // Show the indexes of items on each boundary.
980 {
981 for(int i = 0; i < 5; ++i)
982 {
983 _indexLabels[i] = Text::create(" ", "fonts/Marker Felt.ttf", 12);
984 _indexLabels[i]->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
985 _uiLayer->addChild(_indexLabels[i]);
986 }
987 float deltaX = 145, deltaY = 90;
988 _indexLabels[0]->setPosition(_uiLayer->getContentSize() / 2 + Size(-deltaX, 0.0f)); // left
989 _indexLabels[1]->setPosition(_uiLayer->getContentSize() / 2 + Size(deltaX, 0.0f)); // right
990 _indexLabels[2]->setPosition(_uiLayer->getContentSize() / 2 + Size(0.0f, deltaY)); // top
991 _indexLabels[3]->setPosition(_uiLayer->getContentSize() / 2 + Size(0.0f, -deltaY)); // bottom
992 _indexLabels[4]->setPosition(_uiLayer->getContentSize() / 2 + Size(deltaX, deltaY)); // center
993
994 // Callback
995 _listView->ScrollView::addEventListener([this](Ref* ref, ScrollView::EventType eventType) {
996 ListView* listView = dynamic_cast<ListView*>(ref);
997 if(listView == nullptr || eventType != ScrollView::EventType::CONTAINER_MOVED)
998 {
999 return;
1000 }
1001 auto left = listView->getLeftmostItemInCurrentView();
1002 auto right = listView->getRightmostItemInCurrentView();
1003 auto top = listView->getTopmostItemInCurrentView();
1004 auto bottom = listView->getBottommostItemInCurrentView();
1005 auto center = listView->getCenterItemInCurrentView();
1006
1007 _indexLabels[0]->setString(StringUtils::format("Left\nindex=%zd", listView->getIndex(left)));
1008 _indexLabels[1]->setString(StringUtils::format("RIght\nindex=%zd", listView->getIndex(right)));
1009 _indexLabels[2]->setString(StringUtils::format("Top index=%zd", listView->getIndex(top)));
1010 _indexLabels[3]->setString(StringUtils::format("Bottom index=%zd", listView->getIndex(bottom)));
1011 _indexLabels[4]->setString(StringUtils::format("Center\nindex=%zd", listView->getIndex(center)));
1012 });
1013 }
1014
1015 // Add list items
1016 static const Size BUTTON_SIZE(100, 70);
1017 for (int i = 0; i < 40; ++i)
1018 {
1019 auto pButton = Button::create("cocosui/button.png", "cocosui/buttonHighlighted.png");
1020 pButton->setContentSize(BUTTON_SIZE);
1021 pButton->setScale9Enabled(true);
1022 pButton->setTitleText(StringUtils::format("Button-%d", i));
1023 _listView->pushBackCustomItem(pButton);
1024 }
1025 return true;
1026}
1027
1028void UIListViewTest_Padding::sliderEvent(Ref *pSender, Slider::EventType type)
1029{
1030 if (type == Slider::EventType::ON_PERCENTAGE_CHANGED)
1031 {
1032 auto slider = dynamic_cast<Slider*>(pSender);
1033 // left
1034 if (slider && slider->getTag() == 0)
1035 {
1036 int left = slider->getPercent() / 100.f * 50.f;
1037 CCLOG("Left Padding: %d", left);
1038 _listView->setLeftPadding(left);
1039 _paddingLabels[0]->setString(StringUtils::format("Left\nPadding=%d", left));
1040 }
1041 // top
1042 if (slider && slider->getTag() == 1)
1043 {
1044 int top = slider->getPercent() / 100.f * 50.f;
1045 CCLOG("Top Padding: %d", top);
1046 _listView->setTopPadding(top);
1047 _paddingLabels[1]->setString(StringUtils::format("Top\nPadding=%d", top));
1048 }
1049 // right
1050 if (slider && slider->getTag() == 2)
1051 {
1052 int right = slider->getPercent() / 100.f * 50.f;
1053 CCLOG("Right Padding: %d", right);
1054 _listView->setRightPadding(right);
1055 _paddingLabels[2]->setString(StringUtils::format("Right\nPadding=%d", right));
1056 }
1057 // bottom
1058 if (slider && slider->getTag() == 3)
1059 {
1060 int bottom = slider->getPercent() / 100.f * 50.f;
1061 CCLOG("Bottom Padding: %d", bottom);
1062 _listView->setBottomPadding(bottom);
1063 _paddingLabels[3]->setString(StringUtils::format("Bottom\nPadding=%d", bottom));
1064 }
1065 }
1066}
#define ADD_TEST_CASE(__className__)
Definition: BaseTest.h:211
const char * font_UIListViewTest
USING_NS_CC
virtual bool init() override
virtual bool init() override
virtual std::string title() const
Definition: BaseTest.h:59
virtual bool init() override
void selectedItemEvent(cocos2d::Ref *sender, cocos2d::ui::ListView::EventType type)
virtual void update(float dt) override
float getItemPositionXInView(cocos2d::ui::Widget *item) const
std::vector< std::string > _array
cocos2d::ui::ListView * _listView
cocos2d::ui::Text * _displayValueLabel
void updateItem(int itemID, int templateID)
cocos2d::ui::Text * _titleLabel
virtual cocos2d::ui::ScrollView::Direction getListViewDirection() const =0
virtual bool init() override
cocos2d::ui::ListView * _listView
cocos2d::ui::Text * _indexLabels[5]
virtual bool init() override
cocos2d::ui::Text * _titleLabel
cocos2d::ui::Text * _indexLabels[5]
void sliderEvent(cocos2d::Ref *pSender, cocos2d::ui::Slider::EventType type)
cocos2d::ui::ListView * _listView
virtual cocos2d::ui::ScrollView::Direction getListViewDirection() const =0
cocos2d::ui::Text * _paddingLabels[4]
virtual cocos2d::ui::ScrollView::Direction getListViewDirection() const =0
cocos2d::ui::Text * _titleLabel
cocos2d::ui::ListView * _listView
virtual bool init() override
virtual void update(float dt) override
std::vector< std::string > _array
cocos2d::ui::Text * _displayValueLabel
virtual bool init() override
float getItemPositionYInView(cocos2d::ui::Widget *item) const
cocos2d::ui::ListView * _listView
void selectedItemEvent(cocos2d::Ref *sender, cocos2d::ui::ListView::EventType type)
void updateItem(int itemID, int templateID)
cocos2d::ui::Text * _indexLabels[3]
void selectedItemEventScrollView(cocos2d::Ref *sender, cocos2d::ui::ScrollView::EventType type)
cocos2d::Layer * _uiLayer
Definition: UIScene.h:44
virtual bool init() override
Definition: UIScene.cpp:46
cocos2d::ui::Layout * _widget
Definition: UIScene.h:45