Cocos2d v4.0中PageView无addEventListenerPageView,如何实现页面滚动代理?
在Cocos2d-x v4.0中实现PageView滚动事件监听的替代方案
在Cocos2d-x v4.0里,旧的addEventListenerPageView和基于selector的事件绑定方式已经被移除,取而代之的是基于std::function的通用事件监听系统。下面是适配你原有代码的两种实现方式:
方式1:使用Lambda表达式(推荐,代码更紧凑)
直接在PageView初始化时用lambda处理事件,无需额外调整成员函数:
// 替换你原来的pageView->addEventListenerPageView(...)这一行 pageView->addEventListener([this](EventCustom* event) { // 从事件中获取PageView的事件数据 auto pageViewEvent = static_cast<PageViewEvent*>(event->getUserData()); PageView* pageView = static_cast<PageView*>(pageViewEvent->getTarget()); switch (pageViewEvent->getType()) { case PageView::EventType::TURNING: { _displayValueLabel->setString(StringUtils::format("page = %ld", static_cast<long>(pageView->getCurrentPageIndex() + 1))); } break; // 你可以在这里处理其他PageView事件,比如BEGIN_DRAG、END_DRAG等 default: break; } });
方式2:绑定到类成员函数(保留原有函数结构)
如果你想继续使用类成员函数处理事件,需要先调整函数的参数签名,再通过std::bind绑定:
1. 修改事件处理函数的参数
把原来的pageViewEvent函数改成以下形式:
void GBMapScreen::pageViewEvent(EventCustom* event) { auto pageViewEvent = static_cast<PageViewEvent*>(event->getUserData()); PageView* pageView = static_cast<PageView*>(pageViewEvent->getTarget()); switch (pageViewEvent->getType()) { case PageView::EventType::TURNING: { _displayValueLabel->setString(StringUtils::format("page = %ld", static_cast<long>(pageView->getCurrentPageIndex() + 1))); } break; default: break; } }
2. 绑定事件监听
替换原来的addEventListenerPageView调用为:
#include <functional> // 需要包含这个头文件来使用std::bind // ... pageView->addEventListener(std::bind(&GBMapScreen::pageViewEvent, this, std::placeholders::_1));
关键说明
- v4中所有UI组件的事件都统一通过
addEventListener方法绑定,事件数据通过EventCustom::getUserData()获取,类型为对应组件的Event类(这里是PageViewEvent)。 PageView::EventType替代了旧的PageViewEventType,可用的事件类型和v3基本一致,比如TURNING(页面切换完成)、BEGIN_DRAG(开始拖拽)、END_DRAG(结束拖拽)等。
内容的提问来源于stack exchange,提问作者Guru
相关产品推荐
相关产品推荐

