slideview.wxs 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. /* eslint-disable */
  2. var 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. }
  14. var 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. }
  74. var 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. }
  107. var REBOUNCE_TIME = 0.2
  108. var 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. }
  135. var 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. }
  156. var 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. }
  161. var 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. }
  195. var disableChange = function(newVal, oldVal, ownerInstance, ins) {
  196. var st = ins.getState()
  197. st.disable = newVal
  198. }
  199. var durationChange = function(newVal, oldVal, ownerInstance, ins) {
  200. var st = ins.getState()
  201. st.duration = newVal || 400
  202. }
  203. var 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. }
  214. var rebounceChange = function(newVal, oldVal, ownerInstance, ins) {
  215. var st = ins.getState()
  216. // console.log('rebounce', st.rebounce)
  217. st.rebounce = newVal
  218. }
  219. var 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. }
  232. module.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. }