cocos2dx ListView or ScrollView to SCROLL_TO_BOTTOM doubel call to solve

功能需求上需要使用动态去加载 item 的时候,我想到的第一个方法就是当listview滑动到底部的时候再动态的创建出一部分 item 控件。但是有个很蛋疼的事情,直接调用


ListView:addScrollViewEventListener( function ( sender,eventType )
if evenType == ccui.ScrollviewEventType.scrollToBottom then
print( "callback func" );
end
end );


然后当滑动到最下面的时候就一直打印一直打印。。。蛋疼。
于是我便相处了另一个方案:利用监听点击事件去处理这个逻辑


ListView:addTouchEventListener(function (sender,eventType)
if eventType == ccui.TouchEventType.ended then
local eInnerPos = ListView:getInnerContainerPosition();
--// 偏移量 20 个像素
if eInnerPos.y >= 20 then
print( "------ call back function" );
end
end

end );



还有一个一劳永逸的方法,给 scrollview 加一个成员函数。在 UIScrollView.lua 文件里的 scrollview 类加入成员函数

function ScrollView:addScrollViewMoveSideCallFunc( callback )
    local InnerSize = self:getInnerContainerSize();
    local ContentSize = self:getContentSize();
    self:addTouchEventListener( function ( sender,TouchEventType )
        if TouchEventType == ccui.TouchEventType.ended then
            local eInnerPos = self:getInnerContainerPosition();
            local topOffY = ((InnerSize.height-ContentSize.height)*-1);
            if eInnerPos.y <= topOffY-20 then
                callback( "SCROLL_TO_TOP" );
            elseif eInnerPos.y >= 20 then
                callback( "SCROLL_TO_BottOM" );
            end
        end
    end );
end


可恨啊。放进去懂东西把点击事件给拦截了。。。。导致触发不了。。。于是临时想了另一种方法,在list的父控件上加一个跟list大小一样位置一样的 layout。点击事件在 layout 上去触发。

function ScrollView:addScrollViewMoveSideCallFunc( callback )
    local ContentSize = self:getContentSize();
    local EventLayout = ccui.Layout:create();
    EventLayout:setTouchEnabled( true );
    EventLayout:setContentSize( ContentSize );
    local Parent = self:getParent();
    local svPosX = self:getPositionX();
    local svPosY = self:getPositionY();
    EventLayout:setPosition( svPosX - ContentSize.width / 2,svPosY - ContentSize.height / 2 );
    Parent:addChild( EventLayout,self:getLocalZOrder() );
    EventLayout:setSwallowtouches( false );
    EventLayout:addTouchEventListener( function ( sender,TouchEventType )
        if TouchEventType == ccui.TouchEventType.ended then
            local InnerSize = self:getInnerContainerSize();
            local eInnerPos = self:getInnerContainerPosition();
            local topOffY = ((InnerSize.height-ContentSize.height)*-1);
            if eInnerPos.y <= topOffY-20 then
                callback( "SCROLL_TO_TOP" );
                print("----- SCROLL_TO_TOP end -----");
                return;
            elseif eInnerPos.y >= 20 then
                callback( "SCROLL_TO_BottOM" );
                print("----- SCROLL_TO_BottOM end -----");
                return;
            end
        end
        callback( "NOT_DEFINE" );
    end );
end

相关文章

    本文实践自 RayWenderlich、Ali Hafizji 的文章《...
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@1...
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从C...
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发...
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《...
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试...