cocos2d-lua中pageview滑動事件回撥
阿新 • • 發佈:2018-12-09
1.在UIPageView.h中將addEventListener修改為如下
CC_DEPRECATED_ATTRIBUTE void addEventListener(const ccPageViewCallback& callback);
using ScrollView::addEventListener;
2.新增函式到UIPageView.h,UIPageView.cpp中
void addEventListener_pageview(const ccPageViewCallback& callback); void PageView::addEventListener_pageview(const ccPageViewCallback& callback) { _eventCallback = callback; ccScrollViewCallback scrollViewCallback = [=](Ref* ref, ScrollView::EventType type)->void{ if (type == ScrollView::EventType::AUTOSCROLL_ENDED) { callback(ref, PageView::EventType::TURNING); } }; this->addEventListener(scrollViewCallback); }
3.新增列舉型別到UIScrollView.h中
typedef enum { SCROLLVIEW_EVENT_SCROLL_TO_TOP, SCROLLVIEW_EVENT_SCROLL_TO_BOTTOM, SCROLLVIEW_EVENT_SCROLL_TO_LEFT, SCROLLVIEW_EVENT_SCROLL_TO_RIGHT, SCROLLVIEW_EVENT_SCROLLING, SCROLLVIEW_EVENT_BOUNCE_TOP, SCROLLVIEW_EVENT_BOUNCE_BOTTOM, SCROLLVIEW_EVENT_BOUNCE_LEFT, SCROLLVIEW_EVENT_BOUNCE_RIGHT, //add SCROLLVIEW_EVENT_AUTOSCROLL_ENDED }ScrollviewEventType; enum class EventType { SCROLL_TO_TOP, SCROLL_TO_BOTTOM, SCROLL_TO_LEFT, SCROLL_TO_RIGHT, SCROLLING, BOUNCE_TOP, BOUNCE_BOTTOM, BOUNCE_LEFT, BOUNCE_RIGHT, CONTAINER_MOVED, //add AUTOSCROLL_ENDED };
4.在UIScrollView.cpp中加入
void ScrollView::processAutoScrolling(float deltaTime) { // Make auto scroll shorter if it needs to deaccelerate. float brakingFactor = (isNecessaryAutoScrollBrake() ? OUT_OF_BOUNDARY_BREAKING_FACTOR : 1); // Elapsed time _autoScrollAccumulatedTime += deltaTime * (1 / brakingFactor); // Calculate the progress percentage float percentage = MIN(1, _autoScrollAccumulatedTime / _autoScrollTotalTime); if(_autoScrollAttenuate) { // Use quintic(5th degree) polynomial percentage = tweenfunc::quintEaseOut(percentage); } // Calculate the new position Vec2 newPosition = _autoScrollStartPosition + (_autoScrollTargetDelta * percentage); bool reachedEnd = (percentage == 1); if(_bounceEnabled) { // The new position is adjusted if out of boundary newPosition = _autoScrollBrakingStartPosition + (newPosition - _autoScrollBrakingStartPosition) * brakingFactor; } else { // Don't let go out of boundary Vec2 moveDelta = newPosition - getInnerContainerPosition(); Vec2 outOfBoundary = getHowMuchOutOfBoundary(moveDelta); if(outOfBoundary != Vec2::ZERO) { newPosition += outOfBoundary; reachedEnd = true; } } //ScrollviewEventType scrollEventType; // Finish auto scroll if it ended if(reachedEnd) { _autoScrolling = false; //add—————————————————————————————— dispatchEvent(SCROLLVIEW_EVENT_AUTOSCROLL_ENDED, EventType::AUTOSCROLL_ENDED); } moveInnerContainer(newPosition - getInnerContainerPosition(), reachedEnd); }
5.在lua_cocos2dx_ui_auto.cpp修改函式
int lua_cocos2dx_ui_PageView_addEventListener(lua_State* tolua_S)
{
int argc = 0;
cocos2d::ui::PageView* cobj = nullptr;
bool ok = true;
#if COCOS2D_DEBUG >= 1
tolua_Error tolua_err;
#endif
#if COCOS2D_DEBUG >= 1
if (!tolua_isusertype(tolua_S,1,"ccui.PageView",0,&tolua_err)) goto tolua_lerror;
#endif
cobj = (cocos2d::ui::PageView*)tolua_tousertype(tolua_S,1,0);
#if COCOS2D_DEBUG >= 1
if (!cobj)
{
tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_ui_PageView_addEventListener'", nullptr);
return 0;
}
#endif
argc = lua_gettop(tolua_S)-1;
if (argc == 1)
{
std::function<void (cocos2d::Ref *, cocos2d::ui::PageView::EventType)> arg0;
do {
// Lambda binding for lua is not supported.
assert(false);
} while(0)
;
if(!ok)
{
tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_ui_PageView_addEventListener'", nullptr);
return 0;
}
//modify——————————————————————————————
cobj->addEventListener_pageview(arg0);
lua_settop(tolua_S, 1);
return 1;
}
luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.PageView:addEventListener",argc, 1);
return 0;
#if COCOS2D_DEBUG >= 1
tolua_lerror:
tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_ui_PageView_addEventListener'.",&tolua_err);
#endif
return 0;
}
6.在lua_cocos2dx_ui_manual.cpp修改函式
static int lua_cocos2dx_PageView_addEventListener(lua_State* L)
{
if (nullptr == L)
return 0;
int argc = 0;
PageView* self = nullptr;
#if COCOS2D_DEBUG >= 1
tolua_Error tolua_err;
if (!tolua_isusertype(L,1,"ccui.PageView",0,&tolua_err)) goto tolua_lerror;
#endif
self = static_cast<PageView*>(tolua_tousertype(L,1,0));
#if COCOS2D_DEBUG >= 1
if (nullptr == self) {
tolua_error(L,"invalid 'self' in function 'lua_cocos2dx_PageView_addEventListener'\n", NULL);
return 0;
}
#endif
argc = lua_gettop(L) - 1;
if (1 == argc)
{
#if COCOS2D_DEBUG >= 1
if (!toluafix_isfunction(L,2,"LUA_FUNCTION",0,&tolua_err) )
{
goto tolua_lerror;
}
#endif
LUA_FUNCTION handler = ( toluafix_ref_function(L,2,0));
//modify————————————————————————————
self->addEventListener_pageview([=](cocos2d::Ref* ref,PageView::EventType eventType){
handleUIEvent(handler, ref, (int)eventType);
});
ScriptHandlerMgr::getInstance()->addCustomHandler((void*)self, handler);
return 0;
}
luaL_error(L, "'addEventListener' function of PageView has wrong number of arguments: %d, was expecting %d\n", argc, 1);
return 0;
#if COCOS2D_DEBUG >= 1
tolua_lerror:
tolua_error(L,"#ferror in function 'addEventListener'.",&tolua_err);
return 0;
#endif
}