quick3.3 UIListview扩展应用

--[[
    自定义滑动列表控件
    1.支持UIListView所有功能
    2.额外增加让条目滑动后始终显示全部功能
    3.额外增加当条目滑过指定区域时发生放大缩小变化,调用enableAreaChange()方法即可开启
 author:chjh0540237
]]
local c = cc
local UIScrollView = cc.ui.UIScrollView
local CustomListView = class("CustomListView",cc.ui.UIListView)

--设置滑动中指定区域内有放大缩小过渡变化
--_areaParam:{point=xxx,areaValue=xxx,scaleRate=xxx}
--若滑动列表为横向,则 point 代表X轴的该点以areaValue 为 区域的中心点来作条目在该区域变化判断
--若滑动列表为竖向,则 point 代表Y轴的该点以areaValue 为 区域的中心点来作条目在该区域变化判断
--scaleRate滑动条目缩放比例,可以不填
--不传参数则取当前列表大小中心位置
function CustomListView:enableAreaChange(_areaParam)
    self.m_isAreaEnabled_ = true
    self.m_area_ = _areaParam
    self.m_rate_ = 1
    return self
end

function CustomListView:autoFixScroll()
    if UIScrollView.DIRECTION_VERTICAL == self.direction then
        self:autoFixY()
    else
        self:autoFixX()
    end
end

--横向滑动时,使条目显示全
function CustomListView:autoFixX()
    local item,pos = self:getFirstVisibleItem()
    local bound = item:getBoundingBox()
    local nodePoint = self.container:convertToWorldSpace(
        c.p(bound.x + bound.width/2,bound.y))
    local index
    if c.rectContainsPoint(self.viewRect_,nodePoint) then
        index = pos
    else
        index = pos + 1
    end
    local toItem = self.items_[index]
    bound = toItem:getBoundingBox()
    self:scrollToPos(-bound.x + self.viewRect_.x,0)
end
--竖向滑动时,使条目显示全
function CustomListView:autoFixY()
    local item,pos = self:getFirstVisibleItem()
    local bound = item:getBoundingBox()
    local nodePoint = self.container:convertToWorldSpace(
        c.p(bound.x,bound.y+bound.height*0.5))
    local index
    if c.rectContainsPoint(self.viewRect_,nodePoint) then
        index = pos
    else
        index = pos + 1
    end
    local toItem = self.items_[index]
    bound = toItem:getBoundingBox()
    self:scrollToPos(0,-bound.y-bound.height+self.viewRect_.height+self.viewRect_.y)
end
 
function CustomListView:getFirstVisibleItem()
    for i=1,#self.items_ do
        if self:isItemInViewRect(self.items_[i]) then
            return self.items_[i],i
        end
    end
end
 
 
function CustomListView:scrollToPos(x,y)
--    local scrollLength = c.pGetLength(c.pSub(c.p(x,y),self.position_))
    self.position_ = c.p(x,y)
    local action = c.MoveTo:create(0.5,self.position_)
    self.scrollNode:runAction(transition.sequence({c.EaseExponentialOut:create(action),c.CallFunc:create(function()
            if self.m_isAreaEnabled_ then
                local _item,_index = self:getScaledItem_()
                self:callListener_{name = "scrollStop",item=_item,pos=_index}
            end
        end)
    }))
    self:scrollChange(x,y)
--    self.scrollNode:runAction(c.EaseElasticOut:create(action))
end
 
function CustomListView:getAllItem()
    return self.items_
end
 
function CustomListView:getFirstItem()
    return self.items_[1]
end
 
function CustomListView:getLastItem()
    return self.items_[#self.items_]
end
-- override
function CustomListView:onTouch_(event)
    if "began" == event.name and not self:isTouchInViewRect(event) then
        printInfo("UIScrollView - touch didn't in viewRect")
        return false
    end
 
    if "began" == event.name and self.touchOnContent then
        local cascadeBound = self.scrollNode:getCascadeBoundingBox()
        if not cc.rectContainsPoint(cascadeBound,cc.p(event.x,event.y)) then
            return false
        end
    end
 
    if "began" == event.name then
        self.prevX_ = event.x
        self.prevY_ = event.y
        self.bDrag_ = false
        local x,y = self.scrollNode:getPosition()
        self.position_ = {x = x,y = y}
 
        transition.stopTarget(self.scrollNode)
        self:callListener_{name = "began",x = event.x,y = event.y}
 
        self:enableScrollBar()
        -- self:changeViewRectToNodeSpaceIf()
 
        self.scaleToWorldSpace_ = self:scaleToParent_()
 
        return true
    elseif "moved" == event.name then
        if self:isShake(event) then
            return
        end
 
        self.bDrag_ = true
        self.speed.x = event.x - event.prevX
        self.speed.y = event.y - event.prevY
 
        if self.direction == UIScrollView.DIRECTION_VERTICAL then
            self.speed.x = 0
        elseif self.direction == UIScrollView.DIRECTION_HORIZONTAL then
            self.speed.y = 0
        else
            -- do nothing
        end
 
        self:scrollBy(self.speed.x,self.speed.y)
        self:scrollChange()
        self:callListener_{name = "moved",y = event.y}
    elseif "ended" == event.name then
        if self.bDrag_ then
            self.bDrag_ = false
            self:scrollAuto()
         -- self:autoFixScroll()
            self:callListener_{name = "ended",y = event.y}
 
            self:disableScrollBar()
        else
            self:callListener_{name = "clicked",y = event.y}
        end
    end
end

 --滚动变化
function CustomListView:scrollChange(x,y)
    if not self.m_isAreaEnabled_ then
    	return
    end
    local scrollX,scrollY = x or self:getScrollNode():getPositionX(),y or self:getScrollNode():getPositionY()
--    printf("当前正在滚动 scrollNode.pos=(%f,%f)",scrollX,scrollY)
    local line  -- = self.viewRect_.width*0.5
    local min,max -- = lineX-80,lineX+80
    local bound
    local _w,_h = self.items_[1]:getItemSize()
    local item
    
    if UIScrollView.DIRECTION_VERTICAL == self.direction then
        if self.m_area_ then
        	line = self.m_area_.point or self.viewRect_.height*0.5
        	_h = self.m_area_.areaValue or _h
            self.m_rate_ = self.m_area_.scaleRate or 1
        else
            line = self.viewRect_.height*0.5
        end
        min,max = line-_h*0.5,line+_h*0.5
        for i=1,#self.items_ do
            item = self.items_[i] 
            local _x,_y = item:getPosition()
            bound = {x=_x,y=_y-self.viewRect_.y,width=_w,height=_h}
            local cury = bound.y+bound.height*0.5+scrollY
            if cury>min and cury<=line then
                self.items_[i]:getContent():setScale(cury/min*self.m_rate_)
                item._isScaled = true
                item:setLocalZOrder(1)
            elseif cury>line and cury<max then
                self.items_[i]:getContent():setScale((line-(cury-line))/min*self.m_rate_)
                item._isScaled = true
                item:setLocalZOrder(1)
            else
                self.items_[i]:getContent():setScale(1)
                item._isScaled = false
                item:setLocalZOrder(0)
            end
        end
    else
        if self.m_area_ then
            line = self.m_area_.point or self.viewRect_.width*0.5
            _w = self.m_area_.areaValue or _w
            self.m_rate_ = self.m_area_.scaleRate or 1
        else
            line = self.viewRect_.width*0.5
        end
        min,max = line-_w*0.5,line+_w*0.5
        for i=1,_y = item:getPosition()

            bound = {x=_x-self.viewRect_.x,y=_y,height=_h}
            local curX = bound.x+bound.width*0.5+scrollX
            if curX>min and curX<=line then
                self.items_[i]:getContent():setScale(curX/min*self.m_rate_)
                item._isScaled = true
                item:setLocalZOrder(1)
            elseif curX>line and curX<max then
                self.items_[i]:getContent():setScale((line-(curX-line))/min*self.m_rate_)
                item._isScaled = true
                item:setLocalZOrder(1)
            else
                self.items_[i]:getContent():setScale(1)
                item._isScaled = false
                item:setLocalZOrder(0)
            end
        end
    end
end
 
function CustomListView:scrollAuto()
    local status = self:twiningScroll()
    if status == "normal" then
        self:elasticScroll(true)
    elseif status == "sideShow" then
        self:elasticScroll(false)
    end
end
 
function CustomListView:twiningScroll()
    if self:isSideShow() then
        -- printInfo("UIScrollView - side is show,so elastic scroll")
        return "sideShow"
    end
    if math.abs(self.speed.x) < 10 and math.abs(self.speed.y) < 10 then
        -- printInfo("#DEBUG,UIScrollView - isn't twinking scroll:"
        --     .. self.speed.x .. " " .. self.speed.y)
        return "normal"
    end
 
    local disX,disY = self:moveXY(0,self.speed.x*6,self.speed.y*6)
 
    transition.moveBy(self.scrollNode,{x = disX,y = disY,time = 0.3,easing = "sineOut",onComplete = function()
                           self:elasticScroll(true)
    end})
end
 
function CustomListView:elasticScroll(fix)
    local cascadeBound = self:getScrollNodeRect()
    local disX,disY = 0,0
    local viewRect = self:getViewRectInWorldSpace()
 
    -- dump(cascadeBound,"UIScrollView - cascBoundingBox:")
    -- dump(viewRect,"UIScrollView - viewRect:")
 
    if cascadeBound.width < viewRect.width then
        disX = viewRect.x - cascadeBound.x
    else
        if cascadeBound.x > viewRect.x then
            disX = viewRect.x - cascadeBound.x
        elseif cascadeBound.x + cascadeBound.width < viewRect.x + viewRect.width then
            disX = viewRect.x + viewRect.width - cascadeBound.x - cascadeBound.width
        end
    end
 
    if cascadeBound.height < viewRect.height then
        disY = viewRect.y + viewRect.height - cascadeBound.y - cascadeBound.height
    else
        if cascadeBound.y > viewRect.y then
            disY = viewRect.y - cascadeBound.y
        elseif cascadeBound.y + cascadeBound.height < viewRect.y + viewRect.height then
            disY = viewRect.y + viewRect.height - cascadeBound.y - cascadeBound.height
        end
    end
    if 0 == disX and 0 == disY then
        if fix then
            self:autoFixScroll()
        end
        return
    end
    self:scrollChange(self.scrollNode:getPositionX()+disX,self.scrollNode:getPositionY()+disY) 
    transition.moveBy(self.scrollNode,easing = "backout",onComplete = function()
                           self:callListener_{name = "scrollEnd"}
--                            self:callListener_{name = "scrollStop"}
    end})
end

function CustomListView:getScaledItem_()
    for i=1,#self.items_ do
        if self.items_[i]._isScaled then
            return self.items_[i],i
        end
    end
    return nil
end

return CustomListView

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


    本文实践自 RayWenderlich、Ali Hafizji 的文章《How To Create Dynamic Textures with CCRenderTexture in Cocos2D 2.X》,文中使用Cocos2D,我在这里使用Cocos2D-x 2.1.4进行学习和移植。在这篇文章,将会学习到如何创建实时纹理、如何用Gimp创建无缝拼接纹
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@163.com微信公众号:HopToad 欢迎转载,转载标注出处:http://blog.csdn.netotbaron/article/details/424343991.  软件准备 下载地址:http://cn.cocos2d-x.org/download 2.  简介2.1         引用C
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从Cocos2D-x官网上下载,进入网页http://www.cocos2d-x.org/download,点击Cocos2d-x以下的Download  v3.0,保存到自定义的文件夹2:从python官网上下载。进入网页https://www.python.org/downloads/,我当前下载的是3.4.0(当前最新
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发引擎,易学易用,支持多种智能移动平台。官网地址:http://cocos2d-x.org/当前版本:2.0    有很多的学习资料,在这里我只做为自己的笔记记录下来,错误之处还请指出。在VisualStudio2008平台的编译:1.下载当前稳
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《最强大脑》娱乐节目。将2048改造成一款挑战玩家对数字记忆的小游戏。邮箱:appdevzw@163.com微信公众号:HopToadAPK下载地址:http://download.csdn.net/detailotbaron/8446223源码下载地址:http://download.csdn.net/
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试以QtCreatorIDE来进行CMake构建。Cocos2d-x3.X地址:https://github.com/cocos2d/cocos2d-x1.打开QtCreator,菜单栏→"打开文件或项目...",打开cocos2d-x目录下的CMakeLists.txt文件;2.弹出CMake向导,如下图所示:设置
 下载地址:链接:https://pan.baidu.com/s/1IkQsMU6NoERAAQLcCUMcXQ提取码:p1pb下载完成后,解压进入build目录使用vs2013打开工程设置平台工具集,打开设置界面设置: 点击开始编译等待编译结束编译成功在build文件下会出现一个新文件夹Debug.win32,里面就是编译
分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net前言上次用象棋演示了cocos2dx的基本用法,但是对cocos2dx并没有作深入的讨论,这次以超级马里奥的源代码为线索,我们一起来学习超级马里奥的实
1. 圆形音量button事实上作者的本意应该是叫做“电位计button”。可是我觉得它和我们的圆形音量button非常像,所以就这么叫它吧~先看效果:好了,不多解释,本篇到此为止。(旁白: 噗。就这样结束了?)啊才怪~我们来看看代码:[cpp] viewplaincopyprint?CCContro
原文链接:http://www.cnblogs.com/physwf/archive/2013/04/26/3043912.html为了进一步深入学习贯彻Cocos2d,我们将自己写一个场景类,但我们不会走的太远,凡是都要循序渐进,哪怕只前进一点点,那也至少是前进了,总比贪多嚼不烂一头雾水的好。在上一节中我们建
2019独角兽企业重金招聘Python工程师标准>>>cocos2d2.0之后加入了一种九宫格的实现,主要作用是用来拉伸图片,这样的好处在于保留图片四个角不变形的同时,对图片中间部分进行拉伸,来满足一些控件的自适应(PS: 比如包括按钮,对话框,最直观的形象就是ios里的短信气泡了),这就要求图
原文链接:http://www.cnblogs.com/linji/p/3599478.html1.环境和工具准备Win7VS2010/2012,至于2008v2版本之后似乎就不支持了。 2.安装pythonv.2.0版本之前是用vs模板创建工程的,到vs2.2之后就改用python创建了。到python官网下载版本2.7.5的,然后
环境:ubuntu14.04adt-bundle-linux-x86_64android-ndk-r9d-linux-x86_64cocos2d-x-3.0正式版apache-ant1.9.3python2.7(ubuntu自带)加入环境变量exportANDROID_SDK_ROOT=/home/yangming/adt-bundle-linux/sdkexportPATH=${PATH}:/$ANDROID_SDK_ROOTools/export
1开发背景游戏程序设计涉及了学科中的各个方面,鉴于目的在于学习与进步,本游戏《FlappyBird》采用了两个不同的开发方式来开发本款游戏,一类直接采用win32底层API来实现,另一类采用当前火热的cocos2d-x游戏引擎来开发本游戏。2需求分析2.1数据分析本项目要开发的是一款游
原文链接:http://www.cnblogs.com/linji/p/3599912.html//纯色色块控件(锚点默认左下角)CCLayerColor*ccc=CCLayerColor::create(ccc4(255,0,0,128),200,100);//渐变色块控件CCLayerGradient*ccc=CCLayerGradient::create(ccc4(255,0,0,
原文链接:http://www.cnblogs.com/linji/p/3599488.html//载入一张图片CCSprite*leftDoor=CCSprite::create("loading/door.png");leftDoor->setAnchorPoint(ccp(1,0.5));//设置锚点为右边中心点leftDoor->setPosition(ccp(240,160));/
为了答谢广大学员对智捷课堂以及关老师的支持,现购买51CTO学院关老师的Cocos2d-x课程之一可以送智捷课堂编写图书一本(专题可以送3本)。一、Cocos2d-x课程列表:1、Cocos2d-x入门与提高视频教程__Part22、Cocos2d-x数据持久化与网络通信__Part33、Cocos2d-x架构设计与性能优化内存优
Spawn让多个action同时执行。Spawn有多种不同的create方法,最终都调用了createWithTwoActions(FiniteTimeAction*action1,FiniteTimeAction*action2)方法。createWithTwoActions调用initWithTwoActions方法:对两个action变量初始化:_one=action1;_two=action2;如果两个a
需要环境:php,luajit.昨天在cygwin上安装php和luajit环境,这真特么是一个坑。建议不要用虚拟环境安装打包环境,否则可能会出现各种莫名问题。折腾了一下午,最终将环境转向linux。其中,luajit的安装脚本已经在quick-cocos2d-x-develop/bin/中,直接luajit_install.sh即可。我的lin
v3.0相对v2.2来说,最引人注意的。应该是对触摸层级的优化。和lambda回调函数的引入(嗯嗯,不枉我改了那么多类名。话说,每次cocos2dx大更新。总要改掉一堆类名函数名)。这些特性应该有不少人研究了,所以今天说点跟图片有关的东西。v3.0在载入图片方面也有了非常大改变,仅仅只是