20
@H_
403_13@
localfunctionscrollView2DidScroll()
@H_403_13@
self.bolTouchEnd==
localoffy=self.layerContainer:getPositionY()
@H_ 403_13@
localminy=self.scrollHeight-self.cellNums*self.cellHeight
@H_ 403_13@
offy<0andoffy>minythen
@H_ 403_13@
localitem=-(math.
abs
(offy)%self.cellHeight)
@H_ 403_13@
item<=-self.cellHeight/2then
@H_ 403_13@
offy<self.preOffythen
@H_ 403_13@
item=offy-item-self.cellHeight
@H_ 403_13@
else
@H_ 403_13@
item=offy-item-self.cellHeight
@H_ 403_13@
end
@H_ 403_13@
else
@H_ 403_13@
item=offy-item
@H_ 403_13@
end
@H_ 403_13@
self.scrollView:setContentOffset(ccp(1,item),
)
@H_ 403_13@
end
@H_ 403_13@
end
@H_ 403_13@
顺便提一下,一些全局变量的定义在这里:
5
@H_403_13@
self.scrollTop=208
@H_403_13@
self.scrollHeight=208
@H_ 403_13@
self.scrollWidth=152
@H_ 403_13@
self.cellHeight=52
@H_ 403_13@
self.cellNums=2
@H_ 403_13@
@H_ 403_13@ |
@H_ 403_13@
@H_ 403_13@
至于什么意思,看到命名字段应该还是浅显易懂的,就不一一解释了,其中self.preOffy是记录上一次CCScrollView的偏移量。分页也很简单,首先假定我们的ScrollView的偏移量都是负值,确实也是负值。由于CCScrollView会自动纠正第一项和最后一项的位置,所以在第一项和最后一项时我们不做处理,让CCScrollView的内部方法去实现。如果CCScrollView的偏移量对一个item取余数,如果余数大于item的一半我们就分页,否则就归位。代码if offy < self.preOffy then是为了判定滚动方向是上还是下(我的这个CCScrollView的设置方向是竖直的),好了到此为止我们的完整的带分页的CCScrollView就实现了。
现在要对其添加数据,方便起见我又创建了一个类名称为LLScrollItem,实现一个item的类,并为其添加了一个ON_TOUCH_EVENT的事件,完整代码如下:
20
@H_403_13@
21
@H_ 403_13@
22
@H_ 403_13@
23
@H_ 403_13@
24
@H_ 403_13@
25
@H_ 403_13@
26
@H_ 403_13@
@H_902_ 403@
27
@H_ 403_13@
28
@H_ 403_13@
29
@H_ 403_13@
30
@H_ 403_13@
31
@H_ 403_13@
32
@H_ 403_13@
33
@H_ 403_13@
34
@H_ 403_13@
35
@H_ 403_13@
36
@H_ 403_13@
37
@H_ 403_13@
38
@H_ 403_13@
39
@H_ 403_13@
40
@H_ 403_13@
localLLScrollItem=
class
(
"LLScrollItem"
,function()
@H_403_13@
display.newNode()
@H_ 403_13@
end)
@H_ 403_13@
LLScrollItem.ON_TOUCH_EVENT=
"on_touch_event"
@H_ 403_13@
functionLLScrollItem:ctor(params)
@H_ 403_13@
cc(self):addComponent(
"components.behavior.EventProtocol"
):exportMethods()
@H_ 403_13@
self.text=params.text
@H_ 403_13@
locallabel=ui.newTTFLabel({
@H_ 403_13@
text=params.text,
@H_ 403_13@
font=
"Arial"
403_13@
size=20,
@H_ 403_13@
})
@H_ 403_13@
label:setTouchEnabled(
)
@H_ 403_13@
label:addNodeEventListener(cc.NODE_TOUCH_EVENT,function(event)
@H_ 403_13@
self:onTouch(event)
@H_ 403_13@
end)
@H_ 403_13@
localrect={
@H_ 403_13@
{0,0},
@H_ 403_13@
{150,
@H_ 403_13@
403_13@
403_13@
403_13@
}
@H_ 403_13@
localr,g,b,s=math.random(0,255),math.random(0,255)
@H_ 403_13@
locallayerColor=display.newColorLayer(ccc4(r,s)):addTo(self)
@H_ 403_13@
403_13@
layerColor:setContentSize(CCSizeMake(150,52))
@H_ 403_13@
localpolygon=display.newPolygon(rect,1):addTo(layerColor)
@H_ 403_13@
403_13@
polygon:setLineWidth(1)
@H_ 403_13@
polygon:setLineColor(ccc4f(255,255))
@H_ 403_13@
label:addTo(polygon)
@H_ 403_13@
label:align(display.CENTER,75,26)
@H_ 403_13@
label:setColor(ccc3(255-r,255-g,255-b))
@H_ 403_13@
end
@H_ 403_13@
functionLLScrollItem:onTouch(event)
@H_ 403_13@
self:dispatchEvent({name=LLScrollItem.ON_TOUCH_EVENT,text=self.text})
@H_ 403_13@
end
@H_ 403_13@
@H_ 403_13@
LLScrollItem
@H_ 403_13@
@H_ 403_13@ |
@H_ 403_13@
@H_ 403_13@
每一个item是一个有范围界定有色层,并用一个Box包裹,并添加了一个独一的文本,用来以后区别我们点击了哪个item。
利用上面的item类我们就可以为CCScrollView添加数据了:
10
@H_403_13@
for
i=1,self.cellNums
do
@H_ 403_13@
self.scrollTop=self.scrollTop-self.cellHeight
@H_ 403_13@
localcell=LLScrollItem.
new
({text=
"ScrollItem:"
..i}):addTo(self.widgetContainer)
@H_ 403_13@
403_13@
@H_ 403_13@
cc.EventProxy.
(cell,cell)
@H_ 403_13@
:addEventListener(cell.ON_TOUCH_EVENT,function(event)
@H_ 403_13@
self.label:setString(event.text)
@H_ 403_13@
end)
@H_ 403_13@
因为容器内容变化了,所以要改变其大小,以便能够完全承载所有数据;设置容器的位置是容器能够达到的最低点,容器的孩子self.widgetContainer,其实是一个真正的承载数据的节点,我们在这里要设置其能够达到的最高高度。
我们之所以要给容器添加一个子节点,并所有数据都添加到其子节点上,是为应对动态增删其数据内容的情况,并使CCScrollView的显示正常。
我们再创建两个控件,一个Label一个Button:
self.label=ui.newTTFLabel({
@H_403_13@
text=
"Hello,World"
403_13@
403_13@
color=ccc3(163,140,14),
@H_ 403_13@
align=ui.TEXT_ALIGN_CENTER
@H_ 403_13@
})
@H_ 403_13@
:pos(display.cx+100,display.cy+100)
@H_ 403_13@
:addTo(self)
@H_ 403_13@
self.button=cc.ui.UIPushButton.
({
@H_ 403_13@
disabled=
"nil"
normal=
"res/GreenScale9Block.png"
pressed=
"res/PinkScale9Block.png"
403_13@
})
@H_ 403_13@
:align(display.CENTER,display.cx+100,display.cy-100)
@H_ 403_13@
:addTo(self)
@H_ 403_13@
:onButtonClicked(
@H_ 403_13@
function()
@H_ 403_13@
self:addItem()
@H_ 403_13@
@H_ 403_13@
@H_ 403_13@
这个Label就是上面所说的self.label,此Button是为了实现动态添加数据的功能,点击Button就为CCScrollView添加数据,我们把其相应事件绑定到了addItem方法,此方法实现为:
23
@H_403_13@
functionLLScrollView:addItem()
@H_403_13@
self.cellNums=self.cellNums+1
@H_ 403_13@
..self.cellNums}):addTo(self.widgetContainer)
@H_ 403_13@
403_13@
@H_ 403_13@
403_13@
403_13@
self.label:setString(event.text)
@H_ 403_13@
end)
@H_ 403_13@
@H_ 403_13@
localh=self.cellNums*self.cellHeight
@H_ 403_13@
h<self.scrollHeightthen
@H_ 403_13@
h=self.scrollHeight
@H_ 403_13@
end
@H_ 403_13@
self.layerContainer:setContentSize(CCSizeMake(self.scrollWidth,h))
@H_ 403_13@
self.widgetContainer:setPositionY(h-self.scrollHeight)
@H_ 403_13@
self.layerContainer:setPositionY(self.scrollHeight-h)
@H_ 403_13@
self.preOffy=self.layerContainer:getPositionY()
@H_ 403_13@
localh1=self.scrollHeight-h
@H_ 403_13@
h1<0thenh1=0end
@H_ 403_13@
self.layerContainer:setPositionY(h1)
@H_ 403_13@
同样的,在添加完数据之后,一定要调整容器及其子节点的位置及大小,否则显示出问题。到此位置我们已经实现了一个完整的能够实现分页、动态添加数据的CCScrollView,至于动态删除,仿照动态添加自然也就出来了。
| | |