cocos2d-x pageView左右循环滑动

30 篇文章 0 订阅
27 篇文章 0 订阅
现项目中武将信息显示采用了PageView控件, 每一页显示6个武将信息, 游戏中武将数量可以为0~n, 如果一次性将所有武将创建出来显示效率可想而知;
所以有了PageView动态刷新并左右循环滑动的需求。大致原理如下:

    假设需要显示的信息为n页:
        1. n = 1,只有一页,不需要做循环滑动。

        2. n = 2,创建3页:page0, page1, page2; page0和page2显示第2页信息, page1显示第1页信息;
    初始化时强制显示page1。

        3. n >= 3,创建3页:page0, page 1, page2; page0显示第n页信息, page1显示第1页信息, page2显示第2页信息;
    初始化时强制显示page1。

    循环实现:
        PageView中有3页及以上时,响应TURNING事件,当滚动到第一页时删除最后一页, 新建一页插入到最前面; 当滚动最后一页时删除第一页
    新建一页插入到最后面。 注:目前只有通过添加删除这种方式来现实pageindex的动态改变。


ccs中界面的设计:

    1. 每一个页的布局不同,在编辑器中将所有页面创建出来,添加删除的原理同上。

    2. 每一个页面布局相同, 在编辑器中只需要拼一个页面,代码中使用clone()即可。



页面布局相同代码实现:


?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
--PageView事件
PAGEVIEW_EVENT_TYPE =
{
    TURNING = 0,  
}
 
--当前显示的页码(1 ~ pages)
local pageIdx = 1
 
--英雄列表(id)
local heroList = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18}
 
--PageView
local pvWnd = touchgroup:getWidgetByName( "test/pv" )
 
 
 
--pIdx:     该页显示的内容索引(1 ~ pages)
--iIdx:     插入位置
--bClone:   是否克隆, 第一页已存在为false, 否则为true
function test:addPage(pIdx, iIdx, bClone)
 
     local newPage = nil
     if not bClone then
         newPage = pvWnd:getPage(0)
     else
         newPage = pvWnd:getPage(0):clone()
     end
     newPage:setTag(pIdx)
     pvWnd:insertPage(newPage, iIdx)
 
     --根据pIdx设置武将信息(每个页面有6个武将)
     for i = 1, 6 do
         -----
     end
 
end
 
--武将面板刷新
function test:updateHeroPanel()
 
     --删除原来的页面(第一页保留用于clone)
     for i = pvWnd:getPages():count() - 1, 1, -1 do
         pvWnd:removePageAtIndex(i)
     end
     
     --添加新的页面(每页显示6个)
     local pages = math.ceil (table.nums(heroList) / 6)
 
     pageIdx = 1
 
     if 1 == pages then
         self:addPage(1, 0, false )
     elseif 2 == pages then
         self:addPage(2, 0, false )
         self:addPage(1, 1, true )
         self:addPage(2, 2, true )
         pvWnd:scrollToPage(1)
     elseif pages >= 3 then
         self:addPage(pages, 0, false )
         self:addPage(1, 1, true )
         self:addPage(2, 2, true )
         pvWnd:scrollToPage(1)
     end
 
end
 
function test:onPageViewEvent(sender, eventType)
     if eventType == PAGEVIEW_EVENT_TYPE.TURNING then
 
         local pages = math.ceil (table.nums(heroList) / 6)
 
         if pages >= 3 then
             if 0 == pvWnd:getCurPageIndex() then
 
                 pageIdx = pageIdx - 1
                 if pageIdx <= 0 then
                     pageIdx = pages
                 end
 
                 local nextPageIdx = pageIdx - 1
                 if nextPageIdx <= 0 then
                     nextPageIdx = pages
                 end
 
                 pvWnd:removePageAtIndex(2)
                 self:addPageToHeroPanel(nextPageIdx, 0, true )
                 
 
                 --PageView的当前页索引为0,在0的位置新插入页后原来的页面0变为1;
                 --PageView自动显示为新插入的页面0,我们需要显示为页面1,所以强制滑动到1.
                 pvWnd:scrollToPage(1)
                 --解决强制滑动到1后回弹效果
                 pvWnd:update(10)  
 
             elseif 2 == pvWnd:getCurPageIndex() then
 
                 pageIdx = pageIdx + 1
                 if pageIdx > pages then
                     pageIdx = 1
                 end
 
                 local nextPageIdx = pageIdx + 1
                 if nextPageIdx > pages then
                     nextPageIdx = 1
                 end
 
                 pvWnd:removePageAtIndex(0)
                 self:addPageToHeroPanel(nextPageIdx, 2, true )
 
             end
         elseif pages == 2 then
             if 0 == pvWnd:getCurPageIndex() then
 
                 local nextPageIdx = 0
                 if 1 == pageIdx then
                     pageIdx = 2
                     nextPageIdx = 1
                 else
                     pageIdx = 1
                     nextPageIdx = 2
                 end
 
                 pvWnd:removePageAtIndex(2)
                 self:addPageToHeroPanel(nextPageIdx, 0, true )
                 
                 --PageView的当前页索引为0,在0的位置新插入页后原来的页面0变为1;
                 --PageView自动显示为新插入的页面0,我们需要显示为页面1,所以强制滑动到1.
                 pvWnd:scrollToPage(1)
                 --解决强制滑动到1后回弹效果
                 pvWnd:update(10)  
 
             elseif 2 == pvWnd:getCurPageIndex() then
 
                 local nextPageIdx = 0
                 if 1 == pageIdx then
                     pageIdx = 2
                     nextPageIdx = 1
                 else
                     pageIdx = 1
                     nextPageIdx = 2
                 end
 
                 pvWnd:removePageAtIndex(0)
                 self:addPageToHeroPanel(nextPageIdx, 2, true )
 
             end
         end
     end
 
end





每一个页面布局不同的实现此处不再赘述!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值