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
}