| var cropper = { | 
|   // 画布x轴起点 | 
|   cutX: 0, | 
|   // 画布y轴起点 | 
|   cutY: 0, | 
|   // 触摸点信息(手指与图片中心点的相对位置) | 
|   touchRelactive: [{ | 
|     x: 0, | 
|     y: 0 | 
|   }], | 
|   // 双指触摸时斜边的长度 | 
|   hypotenuseLength:0, | 
|   // 是否结束触摸 | 
|   touchEndFlag: false, | 
|   // 画布宽高 | 
|   canvasWidth: 0, | 
|   canvasHeight: 0, | 
|   // 图片宽高 | 
|   imgWidth: 0, | 
|   imgHeight: 0, | 
|   // 图片缩放比例 | 
|   scale: 1, | 
|   // 图片旋转角度 | 
|   angle: 0, | 
|   // 图片上边距 | 
|   imgTop: 0, | 
|   // 图片左边距 | 
|   imgLeft: 0, | 
|   // 窗口宽高 | 
|   windowWidth: 0, | 
|   windowHeight: 0, | 
|   init: true | 
| } | 
|   | 
| function bool(str) { | 
|   return str === 'true' || str === true | 
| } | 
|   | 
| function propsChange(prop, oldProp, ownerInstance, instance) { | 
|   if (prop && prop !== 'null') { | 
|     var params = prop.split(',') | 
|     var type = +params[0] | 
|     var dataset = instance.getDataset() | 
|     if (cropper.init || type == 4) { | 
|       cropper.canvasWidth = +dataset.width | 
|       cropper.canvasHeight = +dataset.height | 
|       cropper.imgTop = +dataset.windowheight / 2 | 
|       cropper.imgLeft = +dataset.windowwidth / 2 | 
|       cropper.imgWidth = +dataset.imgwidth | 
|       cropper.imgHeight = +dataset.imgheight | 
|       cropper.windowHeight = +dataset.windowheight | 
|       cropper.windowWidth = +dataset.windowwidth | 
|       cropper.init = false | 
|     } else if (type == 2 || type == 3) { | 
|       cropper.imgWidth = +dataset.imgwidth | 
|       cropper.imgHeight = +dataset.imgheight | 
|     } | 
|     cropper.angle = +dataset.angle | 
|     if (type == 3) { | 
|       imgTransform(ownerInstance) | 
|     } | 
|     switch(type) { | 
|       case 1: | 
|         setCutCenter(ownerInstance) | 
|         // 设置裁剪框大小 | 
|         computeCutSize(ownerInstance) | 
|         // 检查裁剪框是否在范围内 | 
|         cutDetectionPosition(ownerInstance) | 
|         break | 
|       case 2: | 
|         setCutCenter(ownerInstance) | 
|         break | 
|       case 3: | 
|         imgMarginDetectionScale(ownerInstance) | 
|         break | 
|       case 4: | 
|         imageReset(ownerInstance) | 
|         break | 
|       case 5: | 
|         setCutCenter(ownerInstance) | 
|         break | 
|       default: | 
|         break | 
|     } | 
|   } | 
| } | 
|   | 
| function touchStart(event, ownerInstance) { | 
|   var touch = event.touches || event.changedTouches | 
|   cropper.touchEndFlag = false | 
|   if (touch.length === 1) { | 
|     cropper.touchRelactive[0] = { | 
|       x: touch[0].pageX - cropper.imgLeft, | 
|       y: touch[0].pageY - cropper.imgTop | 
|     } | 
|   } else { | 
|     var width = Math.abs(touch[0].pageX - touch[1].pageX) | 
|     var height = Math.abs(touch[0].pageY - touch[1].pageY) | 
|     cropper.touchRelactive = [{ | 
|       x: touch[0].pageX - cropper.imgLeft, | 
|       y: touch[0].pageY - cropper.imgTop | 
|     },{ | 
|       x: touch[1].pageX - cropper.imgLeft, | 
|       y: touch[1].pageY - cropper.imgTop | 
|     }] | 
|     cropper.hypotenuseLength = Math.sqrt(Math.pow(width, 2) + Math.pow(height, 2)) | 
|   } | 
| } | 
|   | 
| function touchMove(event, ownerInstance) { | 
|   var touch = event.touches || event.changedTouches | 
|   if (cropper.touchEndFlag) return | 
|   moveDuring(ownerInstance) | 
|   if (event.touches.length === 1) { | 
|     var left = touch[0].pageX - cropper.touchRelactive[0].x, | 
|       top = touch[0].pageY - cropper.touchRelactive[0].y; | 
|     cropper.imgLeft = left | 
|     cropper.imgTop = top | 
|     imgTransform(ownerInstance) | 
|     imgMarginDetectionPosition(ownerInstance) | 
|   } else { | 
|     var dataset = event.instance.getDataset() | 
|     var minScale = +dataset.minscale | 
|     var maxScale = +dataset.maxscale | 
|     var width = Math.abs(touch[0].pageX - touch[1].pageX), | 
|       height = Math.abs(touch[0].pageY - touch[1].pageY), | 
|       hypotenuse = Math.sqrt(Math.pow(width, 2) + Math.pow(height, 2)), | 
|       scale = cropper.scale * (hypotenuse / cropper.hypotenuseLength), | 
|       current_deg = 0; | 
|     scale = scale <= minScale ? minScale : scale | 
|     scale = scale >= maxScale ? maxScale : scale | 
|     cropper.scale = scale | 
|     imgMarginDetectionScale(ownerInstance, true) | 
|     var touchRelative = [{ | 
|       x: touch[0].pageX - cropper.imgLeft, | 
|       y: touch[0].pageY - cropper.imgTop | 
|     }, { | 
|       x: touch[1].pageX - cropper.imgLeft, | 
|       y: touch[1].pageY - cropper.imgTop | 
|     }] | 
|     cropper.touchRelactive = touchRelative | 
|     cropper.hypotenuseLength = Math.sqrt(Math.pow(width, 2) + Math.pow(height, 2)) | 
|     // 更新视图 | 
|     cropper.angle = cropper.angle + current_deg | 
|     imgTransform(ownerInstance) | 
|   } | 
| } | 
|   | 
| function touchEnd(event, ownerInstance) { | 
|   cropper.touchEndFlag = true | 
|   moveStop(ownerInstance) | 
|   updateData(ownerInstance) | 
| } | 
|   | 
| function moveDuring(ownerInstance) { | 
|   if (!ownerInstance) return | 
|   ownerInstance.callMethod('moveDuring') | 
| } | 
|   | 
| function moveStop(ownerInstance) { | 
|   if (!ownerInstance) return | 
|   ownerInstance.callMethod('moveStop') | 
| } | 
|   | 
| function setCutCenter(ownerInstance) { | 
|   var cutX = (cropper.windowWidth - cropper.canvasWidth) * 0.5 | 
|   var cutY = (cropper.windowHeight - cropper.canvasHeight) * 0.5 | 
|    | 
|   cropper.imgTop = cropper.imgTop - cropper.cutY + cutY | 
|   cropper.cutY = cutY | 
|   cropper.imgLeft = cropper.imgLeft - cropper.cutX + cutX | 
|   cropper.cutX = cutX | 
|   cutDetectionPosition(ownerInstance) | 
|   imgTransform(ownerInstance) | 
|   updateData(ownerInstance) | 
| } | 
|   | 
| // 检测剪裁框位置是否在允许的范围内(屏幕内) | 
| function cutDetectionPosition(ownerInstance) { | 
|   var windowHeight = cropper.windowHeight, | 
|     windowWidth = cropper.windowWidth; | 
|    | 
|   // 检测上边距是否在范围内 | 
|   var cutDetectionPositionTop = function() { | 
|     if (cropper.cutY < 0) { | 
|       cropper.cutY = 0 | 
|     } | 
|     if (cropper.cutY > windowHeight - cropper.canvasHeight) { | 
|       cropper.cutY = windowHeight - cropper.canvasHeight | 
|     } | 
|   } | 
|    | 
|   // 检测左边距是否在范围内 | 
|   var cutDetectionPositionLeft = function() { | 
|     if (cropper.cutX < 0) { | 
|       cropper.cutX = 0 | 
|     } | 
|     if (cropper.cutX > windowWidth - cropper.canvasWidth) { | 
|       cropper.cutX = windowWidth - cropper.canvasWidth | 
|     } | 
|   } | 
|    | 
|   // 裁剪框坐标处理(如果只写一个参数则另一个默认为0,都不写默认为居中) | 
|   if (cropper.cutX === null && cropper.cutY === null) { | 
|     var cutX = (windowWidth - cropper.canvasWidth) * 0.5, | 
|       cutY = (windowHeight - cropper.canvasHeight) * 0.5; | 
|     cropper.cutX = cutX | 
|     cropper.cutY = cutY | 
|   } else if (cropper.cutX !== null && cropper.cutX !== null) { | 
|     cutDetectionPositionTop() | 
|     cutDetectionPositionLeft() | 
|   } else if (cropper.cutX !== null && cropper.cutY === null) { | 
|     cutDetectionPositionLeft() | 
|     cropper.cutY = (windowHeight - cropper.canvasHeight) / 2 | 
|   } else if (cropper.cutX === null && cropper.cutY !== null) { | 
|     cutDetectionPositionTop() | 
|     cropper.cutX = (windowWidth - cropper.canvasWidth) / 2 | 
|   } | 
| } | 
|   | 
| // 图片边缘检测-缩放 | 
| function imgMarginDetectionScale(ownerInstance, delay) { | 
|   var scale = cropper.scale, | 
|     imgWidth = cropper.imgWidth, | 
|     imgHeight = cropper.imgHeight; | 
|   if ((cropper.angle / 90) % 2) { | 
|     imgWidth = cropper.imgHeight | 
|     imgHeight = cropper.imgWidth | 
|   } | 
|   if (imgWidth * scale < cropper.canvasWidth) { | 
|     scale = cropper.canvasWidth / imgWidth | 
|   } | 
|   if (imgHeight * scale < cropper.canvasHeight) { | 
|     scale = Math.max(scale, cropper.canvasHeight / imgHeight) | 
|   } | 
|   imgMarginDetectionPosition(ownerInstance, scale, delay) | 
| } | 
|   | 
| // 图片边缘检测-位置 | 
| function imgMarginDetectionPosition(ownerInstance, scale, delay) { | 
|   var left = cropper.imgLeft, | 
|     top = cropper.imgTop, | 
|     imgWidth = cropper.imgWidth, | 
|     imgHeight = cropper.imgHeight; | 
|   scale = scale || cropper.scale | 
|   if ((cropper.angle / 90) % 2) { | 
|     imgWidth = cropper.imgHeight | 
|     imgHeight = cropper.imgWidth | 
|   } | 
|    | 
|   left = cropper.cutX + (imgWidth * scale) / 2 >= left ? left : cropper.cutX + (imgWidth * scale) / 2 | 
|   left = cropper.cutX + cropper.canvasWidth - (imgWidth * scale) / 2 <= left ? left : cropper.cutX + cropper.canvasWidth - (imgWidth * scale) / 2 | 
|   top = cropper.cutY + (imgHeight * scale) / 2 >= top ? top : cropper.cutY + (imgHeight * scale) / 2 | 
|   top = cropper.cutY + cropper.canvasHeight - (imgHeight * scale) / 2 <= top ? top : cropper.cutY + cropper.canvasHeight - (imgHeight * scale) / 2 | 
|    | 
|   cropper.imgLeft = left | 
|   cropper.imgTop = top | 
|   cropper.scale = scale | 
|   if (!delay || delay === 'null') { | 
|     imgTransform(ownerInstance) | 
|   } | 
| } | 
|   | 
| // 改变截取值大小 | 
| function computeCutSize(ownerInstance) { | 
|   if (cropper.canvasWidth > cropper.windowWidth) { | 
|     cropper.canvasWidth = cropper.windowWidth | 
|   } else if (cropper.canvasWidth + cropper.cutX > cropper.windowWidth) { | 
|     cropper.cutX = cropper.windowWidth - cropper.cutX | 
|   } | 
|   if (cropper.canvasHeight > cropper.windowHeight) { | 
|     cropper.canvasHeight = cropper.windowHeight | 
|   } else if (cropper.canvasHeight + cropper.cutY > cropper.windowHeight) { | 
|     cropper.cutY = cropper.windowHeight - cropper.cutY | 
|   } | 
| } | 
|   | 
| // 图片动画 | 
| function imgTransform(ownerInstance) { | 
|   var image = ownerInstance.selectComponent('.tn-cropper__image') | 
|   if (!image) return | 
|   var x = cropper.imgLeft - cropper.imgWidth / 2, | 
|     y = cropper.imgTop - cropper.imgHeight / 2; | 
|   image.setStyle({ | 
|     'transform': 'translate3d('+ x + 'px,' + y + 'px,0) scale(' + cropper.scale +') rotate(' + cropper.angle + 'deg)' | 
|   }) | 
| } | 
|   | 
| // 图片重置 | 
| function imageReset(ownerInstance) { | 
|   cropper.scale = 1 | 
|   cropper.angle = 0 | 
|   imgTransform(ownerInstance) | 
| } | 
|   | 
| // 高度变化 | 
| function canvasHeight(ownerInstance) { | 
|   if (!ownerInstance) return | 
|   computeCutSize(ownerInstance) | 
| } | 
|   | 
| // 宽度变化 | 
| function canvasWidth(ownerInstance) { | 
|   if (!ownerInstance) return | 
|   computeCutSize(ownerInstance) | 
| } | 
|   | 
| // 更新数据 | 
| function updateData(ownerInstance) { | 
|   if (!ownerInstance) return | 
|   ownerInstance.callMethod('change', { | 
|     cutX: cropper.cutX, | 
|     cutY: cropper.cutY, | 
|     imgWidth: cropper.imgWidth, | 
|     imgHeight: cropper.imgHeight, | 
|     scale: cropper.scale, | 
|     angle: cropper.angle, | 
|     imgTop: cropper.imgTop, | 
|     imgLeft: cropper.imgLeft | 
|   }) | 
| } | 
|   | 
| module.exports = { | 
|   touchStart: touchStart, | 
|   touchMove: touchMove, | 
|   touchEnd: touchEnd, | 
|   propsChange: propsChange | 
| } |