quick(3.2) UIListView扩展
2016-03-14 16:07
756 查看
前言
listview列表,在游戏中非常常见,比如道具列表,玩家列表,排行榜等等。每个版本可能使用方法可能有些差别,但是大同小异,原理和用途都是那几种,设置方向,间隔等。这里是quick-lua3.3版本的使用和简单介绍.
UIListView继承自UIScrollView,掌握UIScrollView用法和源码是非常有必要滴
使用及几个用法
初始化listView
1.例子self.listView=cc.ui.UIListView.new({ direction=cc.ui.UIScrollView.DIRECTION_VERTICAL, alignment=cc.ui.UIListView.ALIGNMENT_VCENTER, viewRect=cc.rect(0,0,bg:getContentSize().width-28,bg:getContentSize().height-88), })
2.参数
-direction列表控件的滚动方向,默认为垂直方向 -alignmentlistViewItem中content的对齐方式,默认为垂直居中 -viewRect列表控件的显示区域 -scrollbarImgH水平方向的滚动条 -scrollbarImgV垂直方向的滚动条 -bgColor背景色,nil表示无背景色 -bgStartColor渐变背景开始色,nil表示无背景色 -bgEndColor渐变背景结束色,nil表示无背景色 -bg背景图 -bgScale9背景图是否可缩放 -capInsets缩放区域
(1)direction
UIScrollView.DIRECTION_BOTH=0 UIScrollView.DIRECTION_VERTICAL=1--垂直 UIScrollView.DIRECTION_HORIZONTAL=2
(2)alignment
UIListView.ALIGNMENT_LEFT=0 UIListView.ALIGNMENT_RIGHT=1 UIListView.ALIGNMENT_VCENTER=2 UIListView.ALIGNMENT_TOP=3 UIListView.ALIGNMENT_BOTTOM=4 UIListView.ALIGNMENT_HCENTER=5
item、设置间隔:
1.使用:localmargin={top=0,bottom=5,left=0,right=0}
locallistItem=self.listView:newItem(node)
listItem:setMargin(margin)--设置间隔(如果是玩家自己的话,就放大一点)
listItem:setItemSize(node:getContentSize().width,node:getContentSize().height)
setMargin原理
2.在设置itemsize时处理margin_
functionUIListViewItem:setItemSize(w,h,bNoMargin)
ifnotbNoMarginthen
ifUIScrollView.DIRECTION_VERTICAL==self.lvDirection_then
h=h+self.margin_.top+self.margin_.bottom
else
w=w+self.margin_.left+self.margin_.right
end
end
--print("UIListViewItem-setItemSizew:"..w.."h:"..h)
localoldSize={width=self.width,height=self.height}
localnewSize={width=w,height=h}
self.width=wor0
self.height=hor0
self:setContentSize(w,h)
localbg=self:getChildByTag(UIListViewItem.BG_TAG)
ifbgthen
bg:setContentSize(w,h)
bg:setPosition(cc.p(w/2,h/2))
end
self.listener(self,newSize,oldSize)
end
注:设置间隔可以直接
listItem:setItemSize(node:getContentSize().width,node:getContentSize().height+XXXXX)
直接加也可以
UIListView.lua函数
framework/cc/ui/文件夹下--------------------------------
--@moduleUIListView
--[[--
quick列表控件
]]
localUIScrollView=import(".UIScrollView")
localUIListView=class("UIListView",UIScrollView)
localUIListViewItem=import(".UIListViewItem")
UIListView.DELEGATE="ListView_delegate"
UIListView.TOUCH_DELEGATE="ListView_Touch_delegate"
UIListView.CELL_TAG="Cell"
UIListView.CELL_SIZE_TAG="CellSize"
UIListView.COUNT_TAG="Count"
UIListView.CLICKED_TAG="Clicked"
UIListView.UNLOAD_CELL_TAG="UnloadCell"
UIListView.BG_ZORDER=-1
UIListView.CONTENT_ZORDER=10
UIListView.ALIGNMENT_LEFT=0 UIListView.ALIGNMENT_RIGHT=1 UIListView.ALIGNMENT_VCENTER=2 UIListView.ALIGNMENT_TOP=3 UIListView.ALIGNMENT_BOTTOM=4 UIListView.ALIGNMENT_HCENTER=5
--start--
--------------------------------
--UIListView构建函数
--@function[parent=#UIListView]new
--@paramtableparams参数表
--[[--
UIListView构建函数
可用参数有:
-direction列表控件的滚动方向,默认为垂直方向 -alignmentlistViewItem中content的对齐方式,默认为垂直居中 -viewRect列表控件的显示区域 -scrollbarImgH水平方向的滚动条 -scrollbarImgV垂直方向的滚动条 -bgColor背景色,nil表示无背景色 -bgStartColor渐变背景开始色,nil表示无背景色 -bgEndColor渐变背景结束色,nil表示无背景色 -bg背景图 -bgScale9背景图是否可缩放 -capInsets缩放区域
]]
--end--
functionUIListView:ctor(params)
UIListView.super.ctor(self,params)
self.items_={}
self.direction=params.directionorUIScrollView.DIRECTION_VERTICAL
self.alignment=params.alignmentorUIListView.ALIGNMENT_VCENTER
self.bAsyncLoad=params.asyncorfalse
self.container=cc.Node:create()
--self.padding_=params.paddingor{left=0,right=0,top=0,bottom=0}
--params.viewRect.x=params.viewRect.x+self.padding_.left
--params.viewRect.y=params.viewRect.y+self.padding_.bottom
--params.viewRect.width=params.viewRect.width-self.padding_.left-self.padding_.right
--params.viewRect.height=params.viewRect.height-self.padding_.bottom-self.padding_.top
self:setDirection(params.direction)
self:setViewRect(params.viewRect)
self:addScrollNode(self.container)
self:onScroll(handler(self,self.scrollListener))
self.size={}
self.itemsFree_={}
self.delegate_={}
self.redundancyViewVal=0--异步的视图两个方向上的冗余大小,横向代表宽,竖向代表高
end
functionUIListView:onCleanup()
self:releaseAllFreeItems_()
end
--start--
--------------------------------
--列表控件触摸注册函数
--@function[parent=#UIListView]onTouch
--@paramfunctionlistener触摸临听函数
--@returnUIListView#UIListViewself自身
--end--
functionUIListView:onTouch(listener)
self.touchListener_=listener
returnself
end
--start--
--------------------------------
--列表控件设置所有listItem中content的对齐方式
--@function[parent=#UIListView]setAlignment
--@paramnumberalign对
--@returnUIListView#UIListViewself自身
--end--
functionUIListView:setAlignment(align)
self.alignment=align
end
--start--
--------------------------------
--创建一个新的listViewItem项
--@function[parent=#UIListView]newItem
--@paramnodeitem要放到listViewItem中的内容content
--@returnUIListViewItem#UIListViewItem
--end--
functionUIListView:newItem(item)
item=UIListViewItem.new(item)
item:setDirction(self.direction)
item:onSizeChange(handler(self,self.itemSizeChangeListener))
returnitem
end
--start--
--------------------------------
--设置显示区域
--@function[parent=#UIListView]setViewRect
--@returnUIListView#UIListViewself
--end--
functionUIListView:setViewRect(viewRect)
ifUIScrollView.DIRECTION_VERTICAL==self.directionthen
self.redundancyViewVal=viewRect.height
else
self.redundancyViewVal=viewRect.width
end
UIListView.super.setViewRect(self,viewRect)
end
functionUIListView:itemSizeChangeListener(listItem,newSize,oldSize)
localpos=self:getItemPos(listItem)
ifnotposthen
return
end
localitemW,itemH=newSize.width-oldSize.width,newSize.height-oldSize.height
ifUIScrollView.DIRECTION_VERTICAL==self.directionthen
itemW=0
else
itemH=0
end
localcontent=listItem:getContent()
transition.moveBy(content,
{x=itemW/2,y=itemH/2,time=0.2})
self.size.width=self.size.width+itemW
self.size.height=self.size.height+itemH
ifUIScrollView.DIRECTION_VERTICAL==self.directionthen
transition.moveBy(self.container,
{x=-itemW,y=-itemH,time=0.2})
self:moveItems(1,pos-1,itemW,itemH,true)
else
self:moveItems(pos+1,table.nums(self.items_),itemW,itemH,true)
end
end
functionUIListView:scrollListener(event)
if"clicked"==event.namethen
localnodePoint=self.container:convertToNodeSpace(cc.p(event.x,event.y))
localpos
localidx
ifself.bAsyncLoadthen
localitemRect
fori,vinipairs(self.items_)do
localposX,posY=v:getPosition()
localitemW,itemH=v:getItemSize()
itemRect=cc.rect(posX,posY,itemW,itemH)
ifcc.rectContainsPoint(itemRect,nodePoint)then
idx=v.idx_
pos=i
break
end
end
else
nodePoint.x=nodePoint.x-self.viewRect_.x
nodePoint.y=nodePoint.y-self.viewRect_.y
localwidth,height=0,self.size.height
localitemW,itemH=0,0
ifUIScrollView.DIRECTION_VERTICAL==self.directionthen
fori,vinipairs(self.items_)do
itemW,itemH=v:getItemSize()
ifnodePoint.y<heightandnodePoint.y>height-itemHthen
pos=i
idx=pos
nodePoint.y=nodePoint.y-(height-itemH)
break
end
height=height-itemH
end
else
fori,vinipairs(self.items_)do
itemW,itemH=v:getItemSize()
ifnodePoint.x>widthandnodePoint.x<width+itemWthen
pos=i
idx=pos
break
end
width=width+itemW
end
end
end
self:notifyListener_{name="clicked",
listView=self,itemPos=idx,item=self.items_[pos],
point=nodePoint}
else
event.scrollView=nil
event.listView=self
self:notifyListener_(event)
end
end
--start--
--------------------------------
--在列表项中添加一项
--@function[parent=#UIListView]addItem
--@paramnodelistItem要添加的项
--@paramintegerpos要添加的位置,默认添加到最后
--@returnUIListView#UIListView
--end--
functionUIListView:addItem(listItem,pos)
self:modifyItemSizeIf_(listItem)
ifposthen
table.insert(self.items_,pos,listItem)
else
table.insert(self.items_,listItem)
end
self.container:addChild(listItem)
returnself
end
--start--
--------------------------------
--在列表项中移除一项
--@function[parent=#UIListView]removeItem
--@paramnodelistItem要移除的项
--@parambooleanbAni是否要显示移除动画
--@returnUIListView#UIListView
--end--
functionUIListView:removeItem(listItem,bAni)
assert(notself.bAsyncLoad,"UIListView:removeItem()-syncloadnotsupportremove")
localitemW,itemH=listItem:getItemSize()
self.container:removeChild(listItem)
localpos=self:getItemPos(listItem)
ifposthen
table.remove(self.items_,pos)
end
ifUIScrollView.DIRECTION_VERTICAL==self.directionthen
itemW=0
else
itemH=0
end
self.size.width=self.size.width-itemW
self.size.height=self.size.height-itemH
if0==table.nums(self.items_)then
return
end
ifUIScrollView.DIRECTION_VERTICAL==self.directionthen
self:moveItems(1,pos-1,-itemW,-itemH,bAni)
else
self:moveItems(pos,table.nums(self.items_),-itemW,-itemH,bAni)
end
returnself
end
--start--
--------------------------------
--移除所有的项
--@function[parent=#UIListView]removeAllItems
--@returninteger#integer
--end--
functionUIListView:removeAllItems()
self.container:removeAllChildren()
self.items_={}
returnself
end
--start--
--------------------------------
--取某项在列表控件中的位置
--@function[parent=#UIListView]getItemPos
--@paramnodelistItem列表项
--@returninteger#integer
--end--
functionUIListView:getItemPos(listItem)
fori,vinipairs(self.items_)do
ifv==listItemthen
returni
end
end
end
--start--
--------------------------------
--判断某项是否在列表控件的显示区域中
--@function[parent=#UIListView]isItemInViewRect
--@paramintegerpos列表项位置
--@returnboolean#boolean
--end--
functionUIListView:isItemInViewRect(pos)
localitem
if"number"==type(pos)then
item=self.items_[pos]
elseif"userdata"==type(pos)then
item=pos
end
ifnotitemthen
return
end
localbound=item:getBoundingBox()
localnodePoint=self.container:convertToWorldSpace(
cc.p(bound.x,bound.y))
bound.x=nodePoint.x
bound.y=nodePoint.y
returncc.rectIntersectsRect(self.viewRect_,bound)
end
--start--
--------------------------------
--加载列表
--@function[parent=#UIListView]reload
--@returnUIListView#UIListView
--end--
functionUIListView:reload()
ifself.bAsyncLoadthen
self:asyncLoad_()
else
self:layout_()
end
returnself
end
--start--
--------------------------------
--取一个空闲项出来,如果没有返回空
--@function[parent=#UIListView]dequeueItem
--@returnUIListViewItem#UIListViewItemitem
--@seeUIListViewItem
--end--
functionUIListView:dequeueItem()
if#self.itemsFree_<1then
return
end
localitem
item=table.remove(self.itemsFree_,1)
--标识从free中取出,在loadOneItem_中调用release
--这里直接调用release,item会被释放掉
item.bFromFreeQueue_=true
returnitem
end
functionUIListView:layout_()
localwidth,height=0,0
localitemW,itemH=0,0
localmargin
--calcatewholewidthheight
ifUIScrollView.DIRECTION_VERTICAL==self.directionthen
width=self.viewRect_.width
fori,vinipairs(self.items_)do
itemW,itemH=v:getItemSize()
itemW=itemWor0
itemH=itemHor0
height=height+itemH
end
else
height=self.viewRect_.height
fori,vinipairs(self.items_)do
itemW,itemH=v:getItemSize()
itemW=itemWor0
itemH=itemHor0
width=width+itemW
end
end
self:setActualRect({x=self.viewRect_.x,
y=self.viewRect_.y,
width=width,
height=height})
self.size.width=width
self.size.height=height
localtempWidth,tempHeight=width,height
ifUIScrollView.DIRECTION_VERTICAL==self.directionthen
itemW,itemH=0,0
localcontent
fori,vinipairs(self.items_)do
itemW,itemH=v:getItemSize()
itemW=itemWor0
itemH=itemHor0
tempHeight=tempHeight-itemH
content=v:getContent()
content:setAnchorPoint(0.5,0.5)
--content:setPosition(itemW/2,itemH/2)
self:setPositionByAlignment_(content,itemW,itemH,v:getMargin())
v:setPosition(self.viewRect_.x,
self.viewRect_.y+tempHeight)
end
else
itemW,itemH=0,0
tempWidth=0
fori,vinipairs(self.items_)do
itemW,itemH=v:getItemSize()
itemW=itemWor0
itemH=itemHor0
content=v:getContent()
content:setAnchorPoint(0.5,0.5)
--content:setPosition(itemW/2,itemH/2)
self:setPositionByAlignment_(content,itemW,itemH,v:getMargin())
v:setPosition(self.viewRect_.x+tempWidth,self.viewRect_.y)
tempWidth=tempWidth+itemW
end
end
self.container:setPosition(0,self.viewRect_.height-self.size.height)
end
functionUIListView:notifyItem(point)
localcount=self.listener[UIListView.DELEGATE](self,UIListView.COUNT_TAG)
localtemp=(self.direction==UIListView.DIRECTION_VERTICALandself.container:getContentSize().height)or0
localw,h=0,0
localtag=0
fori=1,countdo
w,h=self.listener[UIListView.DELEGATE](self,UIListView.CELL_SIZE_TAG,i)
ifself.direction==UIListView.DIRECTION_VERTICALthen
temp=temp-h
ifpoint.y>tempthen
point.y=point.y-temp
tag=i
break
end
else
temp=temp+w
ifpoint.x<tempthen
point.x=point.x+w-temp
tag=i
break
end
end
end
if0==tagthen
printInfo("UIListView-didn'tfounditem")
return
end
localitem=self.container:getChildByTag(tag)
self.listener[UIListView.DELEGATE](self,UIListView.CLICKED_TAG,tag,point)
end
functionUIListView:moveItems(beginIdx,endIdx,x,y,bAni)
if0==endIdxthen
self:elasticScroll()
end
localposX,posY=0,0
localmoveByParams={x=x,y=y,time=0.2}
fori=beginIdx,endIdxdo
ifbAnithen
ifi==beginIdxthen
moveByParams.onComplete=function()
self:elasticScroll()
end
else
moveByParams.onComplete=nil
end
transition.moveBy(self.items_[i],moveByParams)
else
posX,posY=self.items_[i]:getPosition()
self.items_[i]:setPosition(posX+x,posY+y)
ifi==beginIdxthen
self:elasticScroll()
end
end
end
end
functionUIListView:notifyListener_(event)
ifnotself.touchListener_then
return
end
self.touchListener_(event)
end
functionUIListView:modifyItemSizeIf_(item)
localw,h=item:getItemSize()
ifUIScrollView.DIRECTION_VERTICAL==self.directionthen
ifw~=self.viewRect_.widththen
item:setItemSize(self.viewRect_.width,h,true)
end
else
ifh~=self.viewRect_.heightthen
item:setItemSize(w,self.viewRect_.height,true)
end
end
end
functionUIListView:update_(dt)
UIListView.super.update_(self,dt)
self:checkItemsInStatus_()
ifself.bAsyncLoadthen
self:increaseOrReduceItem_()
end
end
functionUIListView:checkItemsInStatus_()
ifnotself.itemInStatus_then
self.itemInStatus_={}
end
localrectIntersectsRect=function(rectParent,rect)
--dump(rectParent,"parent:")
--dump(rect,"rect:")
localnIntersects--0:nointersects,1:haveintersects,2,haveintersectsandincludetotally
localbIn=rectParent.x<=rect.xand
rectParent.x+rectParent.width>=rect.x+rect.widthand
rectParent.y<=rect.yand
rectParent.y+rectParent.height>=rect.y+rect.height
ifbInthen
nIntersects=2
else
localbNotIn=rectParent.x>rect.x+rect.widthor
rectParent.x+rectParent.width<rect.xor
rectParent.y>rect.y+rect.heightor
rectParent.y+rectParent.height<rect.y
ifbNotInthen
nIntersects=0
else
nIntersects=1
end
end
returnnIntersects
end
localnewStatus={}
localbound
localnodePoint
fori,vinipairs(self.items_)do
bound=v:getBoundingBox()
nodePoint=self.container:convertToWorldSpace(cc.p(bound.x,bound.y))
bound.x=nodePoint.x
bound.y=nodePoint.y
newStatus[i]=
rectIntersectsRect(self.viewRect_,bound)
end
--dump(self.itemInStatus_,"status:")
--dump(newStatus,"newStatus:")
fori,vinipairs(newStatus)do
ifself.itemInStatus_[i]andself.itemInStatus_[i]~=vthen
--print("statsus:"..self.itemInStatus_[i].."v:"..v)
localparams={listView=self,
itemPos=i,
item=self.items_[i]}
if0==vthen
params.name="itemDisappear"
elseif1==vthen
params.name="itemAppearChange"
elseif2==vthen
params.name="itemAppear"
end
self:notifyListener_(params)
else
--print("statussame:"..self.itemInStatus_[i])
end
end
self.itemInStatus_=newStatus
--dump(self.itemInStatus_,"status:")
--print("itemStaus:"..#self.itemInStatus_)
end
--[[--
动态调整item,是否需要加载新item,移除旧item
私有函数
]]
functionUIListView:increaseOrReduceItem_()
if0==#self.items_then
print("ERRORitemscountis0")
return
end
localgetContainerCascadeBoundingBox=function()
localboundingBox
fori,iteminipairs(self.items_)do
localw,h=item:getItemSize()
localx,y=item:getPosition()
localanchor=item:getAnchorPoint()
x=x-anchor.x*w
y=y-anchor.y*h
ifboundingBoxthen
boundingBox=cc.rectUnion(boundingBox,cc.rect(x,y,w,h))
else
boundingBox=cc.rect(x,y,w,h)
end
end
localpoint=self.container:convertToWorldSpace(cc.p(boundingBox.x,boundingBox.y))
boundingBox.x=point.x
boundingBox.y=point.y
returnboundingBox
end
localcount=self.delegate_[UIListView.DELEGATE](self,UIListView.COUNT_TAG)
localnNeedAdjust=2--作为是否还需要再增加或减少item的标志,2表示上下两个方向或左右都需要调整
localcascadeBound=getContainerCascadeBoundingBox()
localitem
localitemW,itemH
--print("childcount:"..self.container:getChildrenCount())
--dump(cascadeBound,"increaseOrReduceItem_cascadeBound:")
--dump(self.viewRect_,"increaseOrReduceItem_viewRect:")
ifUIScrollView.DIRECTION_VERTICAL==self.directionthen
--aheadpartofview
localdisH=cascadeBound.y+cascadeBound.height-self.viewRect_.y-self.viewRect_.height
localtempIdx
item=self.items_[1]
ifnotitemthen
print("increaseOrReduceItem_itemisnil,allitemcount:"..#self.items_)
return
end
tempIdx=item.idx_
--print(string.format("befordisH:%d,viewval:%d",disH,self.redundancyViewVal))
ifdisH>self.redundancyViewValthen
itemW,itemH=item:getItemSize()
ifcascadeBound.height-itemH>self.viewRect_.height
anddisH-itemH>self.redundancyViewValthen
self:unloadOneItem_(tempIdx)
else
nNeedAdjust=nNeedAdjust-1
end
else
item=nil
tempIdx=tempIdx-1
iftempIdx>0then
locallocalPoint=self.container:convertToNodeSpace(cc.p(cascadeBound.x,cascadeBound.y+cascadeBound.height))
item=self:loadOneItem_(localPoint,tempIdx,true)
end
ifnil==itemthen
nNeedAdjust=nNeedAdjust-1
end
end
--partafterview
disH=self.viewRect_.y-cascadeBound.y
item=self.items_[#self.items_]
ifnotitemthen
return
end
tempIdx=item.idx_
--print(string.format("afterdisH:%d,viewval:%d",disH,self.redundancyViewVal))
ifdisH>self.redundancyViewValthen
itemW,itemH=item:getItemSize()
ifcascadeBound.height-itemH>self.viewRect_.height
anddisH-itemH>self.redundancyViewValthen
self:unloadOneItem_(tempIdx)
else
nNeedAdjust=nNeedAdjust-1
end
else
item=nil
tempIdx=tempIdx+1
iftempIdx<=countthen
locallocalPoint=self.container:convertToNodeSpace(cc.p(cascadeBound.x,cascadeBound.y))
item=self:loadOneItem_(localPoint,tempIdx)
end
ifnil==itemthen
nNeedAdjust=nNeedAdjust-1
end
end
else
--leftpartofview
localdisW=self.viewRect_.x-cascadeBound.x
item=self.items_[1]
localtempIdx=item.idx_
ifdisW>self.redundancyViewValthen
itemW,itemH=item:getItemSize()
ifcascadeBound.width-itemW>self.viewRect_.width
anddisW-itemW>self.redundancyViewValthen
self:unloadOneItem_(tempIdx)
else
nNeedAdjust=nNeedAdjust-1
end
else
item=nil
tempIdx=tempIdx-1
iftempIdx>0then
locallocalPoint=self.container:convertToNodeSpace(cc.p(cascadeBound.x,cascadeBound.y))
item=self:loadOneItem_(localPoint,tempIdx,true)
end
ifnil==itemthen
nNeedAdjust=nNeedAdjust-1
end
end
--rightpartofview
disW=cascadeBound.x+cascadeBound.width-self.viewRect_.x-self.viewRect_.width
item=self.items_[#self.items_]
tempIdx=item.idx_
ifdisW>self.redundancyViewValthen
itemW,itemH=item:getItemSize()
ifcascadeBound.width-itemW>self.viewRect_.width
anddisW-itemW>self.redundancyViewValthen
self:unloadOneItem_(tempIdx)
else
nNeedAdjust=nNeedAdjust-1
end
else
item=nil
tempIdx=tempIdx+1
iftempIdx<=countthen
locallocalPoint=self.container:convertToNodeSpace(cc.p(cascadeBound.x+cascadeBound.width,cascadeBound.y))
item=self:loadOneItem_(localPoint,tempIdx)
end
ifnil==itemthen
nNeedAdjust=nNeedAdjust-1
end
end
end
--print("increaseOrReduceItem_()adjust:"..nNeedAdjust)
--print("increaseOrReduceItem_()itemcount:"..#self.items_)
ifnNeedAdjust>0then
returnself:increaseOrReduceItem_()
end
end
--[[--
异步加载列表数据
@returnUIListView
]]
functionUIListView:asyncLoad_()
self:removeAllItems()
self.container:setPosition(0,0)
self.container:setContentSize(cc.size(0,0))
localcount=self.delegate_[UIListView.DELEGATE](self,UIListView.COUNT_TAG)
self.items_={}
localitemW,itemH=0,0
localitem
localcontainerW,containerH=0,0
localposX,posY=0,0
fori=1,countdo
item,itemW,itemH=self:loadOneItem_(cc.p(posX,posY),i)
ifUIScrollView.DIRECTION_VERTICAL==self.directionthen
posY=posY-itemH
containerH=containerH+itemH
else
posX=posX+itemW
containerW=containerW+itemW
end
--初始布局,最多保证可隐藏的区域大于显示区域就可以了
ifcontainerW>self.viewRect_.width+self.redundancyViewVal
orcontainerH>self.viewRect_.height+self.redundancyViewValthen
break
end
end
--self.container:setPosition(self.viewRect_.x,self.viewRect_.y)
ifUIScrollView.DIRECTION_VERTICAL==self.directionthen
self.container:setPosition(self.viewRect_.x,
self.viewRect_.y+self.viewRect_.height)
else
self.container:setPosition(self.viewRect_.x,self.viewRect_.y)
end
returnself
end
--start--
--------------------------------
--设置delegate函数
--@function[parent=#UIListView]setDelegate
--@returnUIListView#UIListView
--end--
functionUIListView:setDelegate(delegate)
self.delegate_[UIListView.DELEGATE]=delegate
end
--[[--
调整item中content的布局,
私有函数
]]
functionUIListView:setPositionByAlignment_(content,w,h,margin)
localsize=content:getContentSize()
if0==margin.leftand0==margin.rightand0==margin.topand0==margin.bottomthen
ifUIScrollView.DIRECTION_VERTICAL==self.directionthen
ifUIListView.ALIGNMENT_LEFT==self.alignmentthen
content:setPosition(size.width/2,h/2)
elseifUIListView.ALIGNMENT_RIGHT==self.alignmentthen
content:setPosition(w-size.width/2,h/2)
else
content:setPosition(w/2,h/2)
end
else
ifUIListView.ALIGNMENT_TOP==self.alignmentthen
content:setPosition(w/2,h-size.height/2)
elseifUIListView.ALIGNMENT_RIGHT==self.alignmentthen
content:setPosition(w/2,size.height/2)
else
content:setPosition(w/2,h/2)
end
end
else
localposX,posY
if0~=margin.rightthen
posX=w-margin.right-size.width/2
else
posX=size.width/2+margin.left
end
if0~=margin.topthen
posY=h-margin.top-size.height/2
else
posY=size.height/2+margin.bottom
end
content:setPosition(posX,posY)
end
end
--[[--
加载一个数据项
私有函数
@paramtableoriginPoint数据项要加载的起始位置
@paramnumberidx要加载数据的序号
@parambooleanbBefore是否加在已有项的前面
@returnUIListViewItemitem
]]
functionUIListView:loadOneItem_(originPoint,idx,bBefore)
--print("UIListViewloadOneItemidx:"..idx)
--dump(originPoint,"originPoint:")
localitemW,itemH=0,0
localitem
localcontainerW,containerH=0,0
localposX,posY=originPoint.x,originPoint.y
localcontent
item=self.delegate_[UIListView.DELEGATE](self,UIListView.CELL_TAG,idx)
ifnil==itemthen
print("ERROR!UIListViewloadnilitem")
return
end
item.idx_=idx
itemW,itemH=item:getItemSize()
ifUIScrollView.DIRECTION_VERTICAL==self.directionthen
itemW=itemWor0
itemH=itemHor0
ifbBeforethen
posY=posY
else
posY=posY-itemH
end
content=item:getContent()
content:setAnchorPoint(0.5,0.5)
self:setPositionByAlignment_(content,itemW,itemH,item:getMargin())
item:setPosition(0,posY)
containerH=containerH+itemH
else
itemW=itemWor0
itemH=itemHor0
ifbBeforethen
posX=posX-itemW
end
content=item:getContent()
content:setAnchorPoint(0.5,0.5)
self:setPositionByAlignment_(content,itemW,itemH,item:getMargin())
item:setPosition(posX,0)
containerW=containerW+itemW
end
ifbBeforethen
table.insert(self.items_,1,item)
else
table.insert(self.items_,item)
end
self.container:addChild(item)
ifitem.bFromFreeQueue_then
item.bFromFreeQueue_=nil
item:release()
end
--localcascadeBound=self.container:getCascadeBoundingBox()
--dump(cascadeBound,"cascadeBound:")
returnitem,itemW,itemH
end
--[[--
移除一个数据项
私有函数
]]
functionUIListView:unloadOneItem_(idx)
--print("UIListViewunloadOneItemidx:"..idx)
localitem=self.items_[1]
ifnil==itemthen
return
end
ifitem.idx_>idxthen
return
end
localunloadIdx=idx-item.idx_+1
item=self.items_[unloadIdx]
ifnil==itemthen
return
end
table.remove(self.items_,unloadIdx)
self:addFreeItem_(item)
--item:removeFromParent(false)
self.container:removeChild(item,false)
self.delegate_[UIListView.DELEGATE](self,UIListView.UNLOAD_CELL_TAG,idx)
end
--[[--
加一个空项到空闲列表中
私有函数
]]
functionUIListView:addFreeItem_(item)
item:retain()
table.insert(self.itemsFree_,item)
end
--[[--
释放所有的空闲列表项
私有函数
]]
functionUIListView:releaseAllFreeItems_()
fori,vinipairs(self.itemsFree_)do
v:release()
end
self.itemsFree_={}
end
returnUIListView
相关文章推荐
- EasyUI常用控件禁用方法:
- 设置UIImage的渲染模式:UIImage.renderingMode
- leetcode 62. Unique Paths
- 使用代码自定义UIView注意一二三
- UIView 面面观
- 解决:百度编辑器UEditor,怎么将图片保存到图片服务器,或者上传到ftp服务器的问题(如果你正在用UE,这篇文章值得你看下)
- 使用UEditor在门户中添加公告
- Ideas and feature requests: Hot (211 ideas) – GenMyModel Support
- Mac下生成CSR(.certSigningRequest)文件
- QtQuick 基础教程(一)
- Django request 常用属性
- 苹果设备相关信息获取方法
- 在使用GPUImage的错误
- 守护线程setDaemon(true)
- LeetCode——Longest Consecutive Sequence
- Java源码阅读之PriorityQueue
- getActivity().runOnUiThread多次执行报NullPointerException
- Versioning with the Override and New Keywords (C# Programming Guide)
- UITextField设置光标颜色
- 2016太原UI设计及web前端工程师必须掌握的代码知识?