
--[[ 自定义滑动列表控件 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扩展应用所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)