drag.wxs 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. var row_Height = 0; //行高
  2. var scrollOffsetTop = 0; //滚动条位置
  3. var isAppH5 = false; //是否APPH5端
  4. var isLongTouch = false; //是否开启长按
  5. var longTouchTime = 350; //触发长安事件事件
  6. var isMove = false; //是否可拖动
  7. var touchTimer=false; //长按事件定时器
  8. function scroll(event,instance){
  9. scrollOffsetTop = event.detail.scrollTop;
  10. }
  11. function touchstart(event, instance) {
  12. isMove = false;
  13. if(row_Height==0){
  14. var rowStyle = event.instance.getComputedStyle(['height']);
  15. row_Height = parseInt(rowStyle.height);//获取行高
  16. console.log(rowStyle.height)
  17. }
  18. var rowData = event.instance.getDataset();
  19. var rowtype = rowData.type == "A" ? "B" : "A";
  20. //重置样式
  21. resetRowStyle(state, instance, rowtype);
  22. var state = instance.getState();
  23. if (event.touches.length == 1) {
  24. state.point = event.touches[0];
  25. state.initscrollOffsetTop = scrollOffsetTop;
  26. state.islongTap = true;
  27. state.rowData = rowData;
  28. //读取数据
  29. var dataViewDOM = instance.selectComponent('#dataView');
  30. var viewData = dataViewDOM.getDataset();
  31. isAppH5 = viewData.isapph5&&JSON.parse(viewData.isapph5);
  32. isLongTouch = viewData.islongtouch&&JSON.parse(viewData.islongtouch);
  33. longTouchTime = parseInt(viewData.longtouchtime);
  34. state.rowData.rownum = viewData.rownum;
  35. state.rowData.listheight = viewData.listheight;
  36. }
  37. // 计算shadowRow.style.top
  38. var rowIndex = parseInt(rowData.index);
  39. var shadowRowTop = rowIndex*row_Height;
  40. shadowRowTop = shadowRowTop - scrollOffsetTop;
  41. // 加载shadowRow数据
  42. instance.callMethod("loadShadowRow", {rowIndex : rowIndex,shadowRowTop:shadowRowTop});
  43. state.shadowRowTop = shadowRowTop;
  44. var shadowBoxComponent = instance.selectComponent('#shadowRowBox');
  45. shadowBoxComponent.setStyle({'top': shadowRowTop + 'px'})
  46. //长按事件
  47. if(isLongTouch){
  48. if(typeof setTimeout !== "undefined"){
  49. touchTimer && clearTimeout(touchTimer);
  50. touchTimer = setTimeout(function(){
  51. longpress(event,instance);
  52. },longTouchTime)
  53. }
  54. }
  55. }
  56. function longpress(event,instance){
  57. if(isLongTouch){
  58. isMove = true;
  59. moveRow(instance, 0)
  60. }
  61. }
  62. function touchmove(event, instance) {
  63. var state = instance.getState();
  64. var rowData = event.instance.getDataset();
  65. var movePoint = event.touches[0];
  66. var initPoint = state.point;
  67. var moveY = movePoint.pageY - initPoint.pageY;
  68. //xy
  69. var moveX=movePoint.pageX-initPoint.pageX
  70. if(isLongTouch){
  71. if(typeof setTimeout !== "undefined" && Math.abs(moveY)>10){
  72. clearTimeout(touchTimer);
  73. }
  74. if (!isMove) {
  75. return ;
  76. }
  77. }
  78. moveRow(instance, moveY,moveX);
  79. //阻止滚动页面
  80. if(event.preventDefault){
  81. event.preventDefault();
  82. }
  83. return false;
  84. }
  85. function touchend(event, instance) {
  86. if(isLongTouch && typeof setTimeout !== "undefined"){
  87. clearTimeout(touchTimer);
  88. }
  89. if(lastCommand!="stop"){
  90. lastCommand = "stop";
  91. instance.callMethod("pageScroll", {'command':"stop"});
  92. }
  93. var state = instance.getState();
  94. var rowtype = state.rowData.type;
  95. if (typeof state.offset !== "undefined" && state.rowData.index != state.offset && state.offset != null) {
  96. instance.callMethod("sort", {
  97. index: state.rowData.index,
  98. offset: state.offset
  99. });
  100. } else {
  101. resetRowStyle(state, instance, rowtype);
  102. resetShadowRowStyle(instance)
  103. feedbackGenerator(instance); //震动反馈
  104. return false;
  105. }
  106. resetShadowRowStyle(instance)
  107. typeof setTimeout !== "undefined" && setTimeout(function() {
  108. resetRowStyle(state, instance, rowtype);
  109. }, 500);
  110. state.offset = null;
  111. oldOffset = null;
  112. feedbackGenerator(instance); //震动反馈
  113. return false;
  114. }
  115. function resetRowStyle(state, instance, rowtype) {
  116. var blockList = instance.selectAllComponents('.row'+rowtype);
  117. for (var i = 0; i < blockList.length; i++) {
  118. blockList[i].setStyle({
  119. 'height': row_Height+'px',
  120. 'transform': 'none',
  121. '-webkit-transform': 'none'
  122. });
  123. blockList[i].removeClass('ani');
  124. blockList[i].removeClass('hide');
  125. }
  126. }
  127. function resetShadowRowStyle(instance) {
  128. var shadowBoxComponent = instance.selectComponent('#shadowRowBox');
  129. shadowBoxComponent.removeClass('show');
  130. shadowBoxComponent.setStyle({});
  131. shadowBoxComponent.removeClass('move');
  132. }
  133. var lastCommand = '';
  134. // move Row
  135. function moveRow(instance, moveY,moveX) {
  136. var state = instance.getState();
  137. var initIndex = parseInt(state.rowData.index);
  138. var rowtype = state.rowData.type;
  139. //显示拖拽行Box
  140. var shadowBoxComponent = instance.selectComponent('#shadowRowBox');
  141. shadowBoxComponent.hasClass('show') || shadowBoxComponent.addClass('show');
  142. //隐藏列表对应行
  143. var rowDom = instance.selectComponent('#row' + rowtype + state.rowData.index);
  144. rowDom.hasClass('hide') || rowDom.addClass('hide');
  145. //拖动shadowRow
  146. var shadowRowDom = instance.selectComponent('#shadowRow');
  147. shadowRowDom.hasClass('move') || shadowRowDom.addClass('move');
  148. shadowRowDom.removeClass('ani');
  149. var style = {
  150. 'transform': 'translateY(' + moveY + 'px) translateX('+ moveX +'px) translateZ(10px)',
  151. '-webkit-transform': 'translateY(' + moveY + 'px) translateX('+ moveX +'px) translateZ(10px)'
  152. }
  153. shadowRowDom.setStyle(style);
  154. var listheight = state.rowData.listheight
  155. var listClientY = state.shadowRowTop + moveY;
  156. var tmpscrollListTop = scrollOffsetTop;
  157. // 拖拽至边缘滚动视图 距离顶部距离1.5行高触发上滚动 下滚动同理
  158. var callMethodData = {
  159. command:listClientY<row_Height*1.5?"up":listClientY>listheight-(row_Height*1.5)?"down":"stop",
  160. scrollTop:tmpscrollListTop,
  161. }
  162. //把滚动指令发给逻辑层
  163. if(lastCommand!=callMethodData.command){
  164. lastCommand = callMethodData.command;
  165. instance.callMethod("pageScroll", callMethodData);
  166. }
  167. var moveOffset = moveY + scrollOffsetTop - state.initscrollOffsetTop;
  168. var offset = calcOffset(initIndex, moveOffset);
  169. if(offset<=2 || offset>=state.rowData.rownum-2){
  170. callMethodData.command = 'stop';
  171. }
  172. //为保证体验,非APP和H5端,在滚动视图期间不进行位置交换
  173. if((!isAppH5) && callMethodData.command!='stop'){
  174. return;
  175. }
  176. oldOffset = oldOffset == null ? initIndex : oldOffset;
  177. if (offset < 0 || offset >= state.rowData.rownum) {
  178. return;
  179. }
  180. if (offset == oldOffset) {
  181. return;
  182. }
  183. oldOffset = offset;
  184. state.offset = offset;
  185. //触发change事件
  186. instance.callMethod("change", {
  187. index: state.rowData.index,
  188. moveTo: state.offset
  189. });
  190. feedbackGenerator(instance); //震动反馈
  191. //根据offset对行进行位置交换
  192. var blockList = instance.selectAllComponents('.row' + rowtype);
  193. for (var i = 0; i < blockList.length; i++) {
  194. if (i == initIndex) {
  195. continue;
  196. }
  197. var translateY = 0;
  198. if ((i >= offset && i < initIndex) || (i <= offset && i > initIndex)) {
  199. translateY = i < initIndex ? row_Height : -row_Height;
  200. }
  201. var style = {
  202. 'height': row_Height+'px',
  203. 'transform': 'translateY(' + translateY + 'px) translateZ(5px)',
  204. '-webkit-transform': 'translateY(' + translateY + 'px) translateZ(5px)'
  205. }
  206. blockList[i].hasClass('ani') || blockList[i].addClass('ani');
  207. blockList[i].setStyle(style);
  208. }
  209. }
  210. //计算偏移index
  211. var oldOffset = null;
  212. function calcOffset(initIndex, moveY) {
  213. var offset = initIndex + parseInt(moveY / row_Height); //偏移 行高的倍数
  214. var rest = moveY % row_Height;
  215. if (rest > 0) {
  216. offset = offset + (rest / row_Height >= 0.6 ? 1 : 0);
  217. if (offset < oldOffset) {
  218. offset = rest / row_Height <= 0.4 ? offset : oldOffset;
  219. }
  220. } else {
  221. offset = offset + (rest / row_Height <= -0.6 ? -1 : 0);
  222. if (offset > oldOffset) {
  223. offset = rest / row_Height >= -0.4 ? offset : oldOffset;
  224. }
  225. }
  226. return offset;
  227. }
  228. //触感反馈
  229. //wxs 不支持条件编译,所以用此方法判断
  230. var isiOSAPP = typeof plus != "undefined" && plus.os.name == 'iOS';
  231. var UISelectionFeedbackGenerator;
  232. var UIImpactFeedbackGenerator;
  233. var impact
  234. if (isiOSAPP) {
  235. UISelectionFeedbackGenerator = plus.ios.importClass("UISelectionFeedbackGenerator");
  236. impact = new UISelectionFeedbackGenerator();
  237. impact.init();
  238. }
  239. function feedbackGenerator(instance) {
  240. if (isiOSAPP) {
  241. impact.selectionChanged();
  242. } else {
  243. if (typeof plus != "undefined") {
  244. plus.device.vibrate(12)
  245. } else {
  246. instance.callMethod("vibrate");
  247. }
  248. }
  249. }
  250. module.exports = {
  251. scroll:scroll,
  252. longpress:longpress,
  253. touchstart: touchstart,
  254. touchmove: touchmove,
  255. touchend: touchend
  256. }