quick3.3 UIListview扩展应用

quick3.3 UIListview扩展应用,第1张

概述--[[ 自定义滑动列表控件 1.支持UIListView所有功能 2.额外增加让条目滑动后始终显示全部功能 3.额外增加当条目滑过指定区域时发生放大缩小变化,调用enableAreaChange()方法即可开启 author:chjh0540237]]local c = cclocal UIScrollView = cc.ui.UIScrollViewl
--[[    自定义滑动列表控件    1.支持UIListVIEw所有功能    2.额外增加让条目滑动后始终显示全部功能    3.额外增加当条目滑过指定区域时发生放大缩小变化,调用enableAreaChange()方法即可开启 author:chjh0540237]]local c = cclocal UIScrollVIEw = cc.ui.UIScrollVIEwlocal 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 selfendfunction CustomListVIEw:autoFixScroll()    if UIScrollVIEw.DIRECTION_VERTICAL == self.direction then        self:autoFixY()    else        self:autoFixX()    endend--横向滑动时,使条目显示全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    endend  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-- overrIDefunction 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    endend --滚动变化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    endend function CustomListVIEw:scrollauto()    local status = self:twiningScroll()    if status == "normal" then        self:elasticScroll(true)    elseif status == "sIDeShow" then        self:elasticScroll(false)    endend 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})endfunction CustomListVIEw:getScaledItem_()    for i=1,#self.items_ do        if self.items_[i]._isScaled then            return self.items_[i],i        end    end    return nilendreturn CustomListVIEw
总结

以上是内存溢出为你收集整理的quick3.3 UIListview扩展应用全部内容,希望文章能够帮你解决quick3.3 UIListview扩展应用所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1046977.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-24
下一篇2022-05-24

发表评论

登录后才能评论

评论列表(0条)

    保存