blob: c62d08565a3ff5d6c3e577368b192b41399c20b2 [file] [log] [blame]
binquan.qiu7f2665f2020-03-27 17:19:57 +08001/* eslint-disable */
2var touchstart = function(event, ownerInstance) {
3 var ins = event.instance
4 var st = ins.getState()
5 if (st.disable) return // disable的逻辑
6 // console.log('touchstart st', JSON.stringify(st))
7 if (!st.size) return
8 // console.log('touchstart', JSON.stringify(event))
9 st.isMoving = true
10 st.startX = event.touches[0].pageX
11 st.startY = event.touches[0].pageY
12 st.firstAngle = 0
13}
14var touchmove = function(event, ownerInstance) {
15 var ins = event.instance
16 var st = ins.getState()
17 if (!st.size || !st.isMoving) return
18 // console.log('touchmove', JSON.stringify(event))
19 var pagex = event.touches[0].pageX - st.startX
20 var pagey = event.touches[0].pageY - st.startY
21 // 左侧45度角为界限,大于45度则允许水平滑动
22 if (st.firstAngle === 0) {
23 st.firstAngle = Math.abs(pagex) - Math.abs(pagey)
24 }
25 if (st.firstAngle < 0) {
26 return
27 }
28 var movex = pagex > 0 ? Math.min(st.max, pagex) : Math.max(-st.max, pagex)
29 // 往回滑动的情况
30 if (st.out) {
31 // 已经是划出来了,还要往左滑动,忽略
32 if (movex < 0) return
33 ins.setStyle({
34 'transform': 'translateX(' + (st.transformx + movex) + 'px)',
35 'transition': ''
36 })
37 var btns = ownerInstance.selectAllComponents('.btn')
38 var transformTotal = 0
39 var len = btns.length
40 var i = len - 1;
41 for (;i >= 0; i--) {
42 var transform = st.size.buttons[i].width / st.max * movex
43 var transformx = st.size.buttons[i].max - Math.min(st.size.buttons[i].max, transform + transformTotal)
44 btns[i].setStyle({
45 'transform': 'translateX(' + (-transformx) + 'px)',
46 'transition': ''
47 })
48 transformTotal += transform
49 }
50 return false
51 }
52 if (movex > 0) movex = 0
53 ins.setStyle({
54 'transform': 'translateX(' + movex + 'px)',
55 'transition': ''
56 })
57 st.transformx = movex
58 var btns = ownerInstance.selectAllComponents('.btn')
59 var transformTotal = 0
60 var len = btns.length
61 var i = len - 1;
62 for (;i >= 0; i--) {
63 var transform = st.size.buttons[i].width / st.max * movex
64 var transformx = Math.max(-st.size.buttons[i].max, transform + transformTotal)
65 btns[i].setStyle({
66 'transform': 'translateX(' + transformx + 'px)',
67 'transition': ''
68 })
69 st.size.buttons[i].transformx = transformx
70 transformTotal += transform
71 }
72 return false // 禁止垂直方向的滑动
73}
74var touchend = function(event, ownerInstance) {
75 var ins = event.instance
76 var st = ins.getState()
77 if (!st.size || !st.isMoving) return
78 // 左侧45度角为界限,大于45度则允许水平滑动
79 if (st.firstAngle < 0) {
80 return
81 }
82 var duration = st.duration / 1000
83 st.isMoving = false
84 // console.log('touchend', JSON.stringify(event))
85 var btns = ownerInstance.selectAllComponents('.btn')
86 var len = btns.length
87 var i = len - 1
88 // console.log('len size', len)
89 if (Math.abs(event.changedTouches[0].pageX - st.startX) < st.throttle || event.changedTouches[0].pageX - st.startX > 0) { // 方向也要控制
90 st.out = false
91 ins.setStyle({
92 'transform': 'translate3d(0px, 0, 0)',
93 'transition': 'transform ' + (duration) + 's'
94 })
95 for (;i >= 0; i--) {
96 btns[i].setStyle({
97 'transform': 'translate3d(0px, 0, 0)',
98 'transition': 'transform ' + (duration) + 's'
99 })
100 }
101 ownerInstance.callMethod('hide')
102 return
103 }
104 showButtons(ins, ownerInstance, duration)
105 ownerInstance.callMethod('show')
106}
107var REBOUNCE_TIME = 0.2
108var showButtons = function(ins, ownerInstance, withDuration) {
109 var st = ins.getState()
110 if (!st.size) return
111 var rebounceTime = st.rebounce ? REBOUNCE_TIME : 0
112 var movex = st.max
113 st.out = true
114 var btns = ownerInstance.selectAllComponents('.btn')
115 var rebounce = st.rebounce || 0
116 var len = btns.length
117 var i = len - 1
118 ins.setStyle({
119 'transform': 'translate3d(' + (-movex - rebounce) + 'px, 0, 0)',
120 'transition': 'transform ' + (withDuration) + 's'
121 })
122 st.transformx = -movex
123 var transformTotal = 0
124 for (;i >= 0; i--) {
125 var transform = st.size.buttons[i].width / st.max * movex
126 var transformx = (-(transform + transformTotal))
127 btns[i].setStyle({
128 'transform': 'translate3d(' + transformx + 'px, 0, 0)',
129 'transition': 'transform ' + (withDuration ? withDuration + rebounceTime : withDuration) + 's'
130 })
131 st.size.buttons[i].transformx = transformx
132 transformTotal += transform
133 }
134}
135var innerHideButton = function(ownerInstance) {
136 var ins = ownerInstance.selectComponent('.left')
137 var st = ins.getState()
138 if (!st.size) return
139 var duration = st.duration ? st.duration / 1000 : 0
140 var btns = ownerInstance.selectAllComponents('.btn')
141 var len = btns.length
142 var i = len - 1
143 ins.setStyle({
144 'transform': 'translate3d(0px, 0, 0)',
145 'transition': 'transform ' + (duration) + 's'
146 })
147 st.transformx = 0
148 for (;i >= 0; i--) {
149 btns[i].setStyle({
150 'transform': 'translate3d(0px, 0, 0)',
151 'transition': 'transform ' + (duration) + 's'
152 })
153 st.size.buttons[i].transformx = 0
154 }
155}
156var hideButton = function(event, ownerInstance) {
157 innerHideButton(ownerInstance)
158 ownerInstance.callMethod('buttonTapByWxs', {index: event.currentTarget.dataset.index, data: event.currentTarget.dataset.data})
159 return false
160}
161var sizeReady = function(newVal, oldVal, ownerInstance, ins) {
162 var st = ins.getState()
163 // st.disable = newVal && newVal.disable
164 if (newVal && newVal.button && newVal.buttons) {
165 st.size = newVal
166 st.transformx = 0
167 // var min = newVal.button.width
168 var max = 0
169 var len = newVal.buttons.length
170 var i = newVal.buttons.length - 1;
171 var total = 0
172 for (; i >= 0; i--) {
173 max += newVal.buttons[i].width
174 // if (min > newVal.buttons[i]) {
175 // min = newVal.buttons[i].width
176 // }
177 total += newVal.buttons[i].width
178 newVal.buttons[i].max = total
179 newVal.buttons[i].transformx = 0
180 }
181 st.throttle = st.size.throttle || 40 // 固定值
182 st.rebounce = st.size.rebounce
183 st.max = max
184 ownerInstance.selectComponent('.right').setStyle({
185 'line-height': newVal.button.height + 'px',
186 left: (newVal.button.width) + 'px',
187 width: max + 'px'
188 })
189 // console.log('st size', JSON.stringify(newVal))
190 if (!st.size.disable && st.size.show) {
191 showButtons(ins, ownerInstance)
192 }
193 }
194}
195var disableChange = function(newVal, oldVal, ownerInstance, ins) {
196 var st = ins.getState()
197 st.disable = newVal
198}
199var durationChange = function(newVal, oldVal, ownerInstance, ins) {
200 var st = ins.getState()
201 st.duration = newVal || 400
202}
203var showChange = function(newVal, oldVal, ownerInstance, ins) {
204 var st = ins.getState()
205 st.show = newVal
206 if (st.disable) return
207 // console.log('show change')
208 if (st.show) {
209 showButtons(ins, ownerInstance, st.duration)
210 } else {
211 innerHideButton(ownerInstance)
212 }
213}
214var rebounceChange = function(newVal, oldVal, ownerInstance, ins) {
215 var st = ins.getState()
216 // console.log('rebounce', st.rebounce)
217 st.rebounce = newVal
218}
219var transitionEnd = function(event, ownerInstance) {
220 // console.log('transition')
221 var ins = event.instance
222 var st = ins.getState()
223 // 回弹效果
224 if (st.out && st.rebounce) {
225 console.log('transition rebounce', st.rebounce)
226 ins.setStyle({
227 'transform': 'translate3d(' + (-st.max) + 'px, 0, 0)',
228 'transition': 'transform ' + REBOUNCE_TIME +'s'
229 })
230 }
231}
232module.exports = {
233 touchstart: touchstart,
234 touchmove: touchmove,
235 touchend: touchend,
236 hideButton: hideButton,
237 sizeReady: sizeReady,
238 disableChange: disableChange,
239 durationChange: durationChange,
240 showChange: showChange,
241 rebounceChange: rebounceChange,
242 transitionEnd: transitionEnd
243}