| <template name="yq-avatar"> | 
|     <view class="croppage"> | 
|         <canvas canvas-id="avatar-canvas" id="avatar-canvas" class="my-canvas" :style="{top: sT, height: csH}" | 
|             :disable-scroll="false"></canvas> | 
|         <canvas canvas-id="oper-canvas" id="oper-canvas" class="oper-canvas" :style="{top: sT1, height: csH1}" | 
|             :disable-scroll="false" @touchstart="fStart" @touchmove="fMove" @touchend="fEnd"> | 
|         </canvas> | 
|         <canvas canvas-id="prv-canvas" id="prv-canvas" class="prv-canvas" :disable-scroll="false" @touchstart="fHideImg" | 
|             :style="{ height: csH, top: pT }"> | 
|         </canvas> | 
|         <view class="oper-wrapper" :style="{top:tp}"> | 
|             <view class="oper"> | 
|                 <view class="btn-wrapper"> | 
|                     <view @click="rechoose" hover-class="hover" :style="{width: bW}"><text>重选</text></view> | 
|                     <view @click="fUpload" hover-class="hover" :style="{width: bW}"><text>确定</text></view> | 
|                 </view> | 
|             </view> | 
|         </view> | 
|     </view> | 
| </template> | 
|   | 
| <script> | 
|     const tH = 50; | 
|     export default { | 
|         data() { | 
|             return { | 
|                 sT1num: 0, | 
|                 csH1: '0px', | 
|                 sT1: 0, | 
|                 csH: '0px', | 
|                 sD: 'none', | 
|                 sT: '-10000px', | 
|                 pT: '-10000px', | 
|                 iS: {}, | 
|                 sS: {}, | 
|                 bW: '19%', | 
|                 bD: 'flex', | 
|                 tp: 0, | 
|             }; | 
|         }, | 
|         props: { | 
|             avatarSrc: '', | 
|             avatarStyle: '', | 
|             selWidth: '', | 
|             selHeight: '', | 
|             expWidth: '', | 
|             expHeight: '', | 
|             minScale: '', | 
|             maxScale: '', | 
|             canScale: '', | 
|             canRotate: '', | 
|             lockWidth: '', | 
|             lockHeight: '', | 
|             stretch: '', | 
|             lock: '', | 
|             fileType: '', | 
|             noTab: '', | 
|             inner: '', | 
|             quality: '', | 
|             index: '', | 
|             bgImage: '', | 
|         }, | 
|         created() { | 
|             this.cc = uni.createCanvasContext('avatar-canvas', this); | 
|             this.cco = uni.createCanvasContext('oper-canvas', this); | 
|             this.ccp = uni.createCanvasContext('prv-canvas', this); | 
|             this.qlty = parseFloat(this.quality) || 1; //画质 | 
|             this.letRotate = (this.canRotate === false || this.inner === true || this.inner === 'true' || this | 
|                 .canRotate === 'false') ? 0 : 1; //是否旋转 | 
|             this.letScale = (this.canScale === false || this.canScale === 'false') ? 0 : 1; //是否放大 | 
|             this.isin = (this.inner === true || this.inner === 'true') ? 1 : 0; | 
|             this.indx = this.index || undefined; //禁止旋转并在图片范围内移动 | 
|             this.mnScale = parseFloat(this.minScale) || 0.3; //缩小比例 | 
|             this.mxScale = parseFloat(this.maxScale) || 4; //放大比列 | 
|             this.noBar = (this.noTab === true || this.noTab === 'true') ? 1 : 0; //是否存在nobar | 
|             this.stc = this.stretch; //自动铺满 | 
|             this.lck = this.lock; //锁定图方向 x y long short longSel shortSel | 
|             this.fType = this.fileType === 'jpg' ? 'jpg' : 'png'; | 
|             if (this.isin || !this.letRotate) { | 
|                 this.bW = '24%'; | 
|                 this.bD = 'none'; | 
|             } else { | 
|                 this.bW = '19%'; | 
|                 this.bD = 'flex'; | 
|             } | 
|             if (this.noBar) { | 
|                 this.fWindowResize(); | 
|             } else { | 
|                 uni.showTabBar({ | 
|                     fail: () => { | 
|                         this.noBar = 1; | 
|                     }, | 
|                     success: () => { | 
|                         this.noBar = 0; | 
|                     }, | 
|                     complete: (res) => { | 
|                         this.fWindowResize(); | 
|                     } | 
|                 }); | 
|             } | 
|         }, | 
|         methods: { | 
|             //重选 | 
|             rechoose() { | 
|                 const that = this | 
|                 uni.chooseImage({ | 
|                     count: 1, | 
|                     sizeType: ['original', 'compressed'], | 
|                     sourceType: ["album"], | 
|                     success: (res) => { | 
|                         that.sT1 = that.sT | 
|                         that.csH1 = that.csH | 
|                         that.fSelect(res.tempFilePaths[0]) | 
|                     } | 
|                 }); | 
|             }, | 
|             //初始化各种数据 | 
|             fWindowResize() { | 
|                 let sysInfo = uni.getSystemInfoSync(); | 
|                 this.platform = sysInfo.platform; | 
|                 this.wW = sysInfo.windowWidth; | 
|                 // #ifndef H5 | 
|                 let phone = uni.getSystemInfoSync().platform | 
|                 console.log(uni.getSystemInfoSync().platform) | 
|                 if (phone == 'ios') { | 
|                     let h = uni.upx2px(60); //将rpx单位值转换成px 裁剪框自己 | 
|                     let b = uni.upx2px(100); //底部按钮 | 
|                     this.sT1 = (sysInfo.windowHeight - h - b) / 2 + 'px' //裁剪框距离顶部+px | 
|                     this.sT1num = (sysInfo.windowHeight - h - b) / 2 //裁剪框距离顶部不+px | 
|                 } else { | 
|                     this.drawTop = 0; | 
|                 } | 
|                 // #endif | 
|                 // #ifndef MP-ALIPAY | 
|                 let phone = uni.getSystemInfoSync().platform | 
|                 this.wH = sysInfo.windowHeight; //设备高 | 
|                 if (!this.noBar) this.wH += tH; //th=50 | 
|                 this.csH = this.wH - tH + 'px'; //高=设备高-50(导航) | 
|                 if (phone == 'ios') { //适配ios | 
|                     this.csH1 = (this.wH - 50) / 2 + 'px' | 
|                 } else { | 
|                     this.csH1 = this.wH - tH + 'px'; | 
|                 } | 
|                 // #endif | 
|                 this.tp = this.csH; | 
|                 this.pxRatio = this.wW / 750; //设备宽/750  比列 | 
|                 this.expWidth && (this.eW = this.expWidth.toString().indexOf('upx') >= 0 ? parseInt(this.expWidth) * this | 
|                     .pxRatio : parseInt(this.expWidth)); | 
|                 this.expHeight && (this.eH = this.expHeight.toString().indexOf('upx') >= 0 ? parseInt(this.expHeight) * | 
|                     this.pxRatio : parseInt(this.expHeight)); | 
|                 this.fHideImg(); | 
|             }, | 
|             fSelect(r) { | 
|                 if (this.fSelecting) return; | 
|                 this.fSelecting = true; | 
|                 setTimeout(() => { | 
|                     this.fSelecting = false; | 
|                 }, 500); //防抖 | 
|                 let path = this.imgPath = r; //需要剪裁的图片路径 | 
|                 // 获取图片信息 | 
|                 uni.getImageInfo({ | 
|                     src: path, | 
|                     success: r => { | 
|                         this.imgWidth = r.width; | 
|                         this.imgHeight = r.height; | 
|                         this.path = path; | 
|                         if (!this.hasSel) { | 
|                             let style = this.sS || {}; | 
|                             if (this.selWidth && this.selHeight) { //设置的剪裁区域宽高 | 
|                                 let sW = this.selWidth.toString().indexOf('upx') >= 0 ? | 
|                                     parseInt(this.selWidth) * this.pxRatio : parseInt( | 
|                                         this.selWidth), | 
|                                     sH = this.selHeight.toString().indexOf('upx') >= 0 ? | 
|                                     parseInt(this.selHeight) * this.pxRatio : parseInt( | 
|                                         this.selHeight); | 
|                                 style.width = sW + 'px'; | 
|                                 style.height = sH + 'px'; | 
|                                 style.top = ((this.wH - sH - tH) | 0) / 2 + 'px'; | 
|                                 style.left = ((this.wW - sW) | 0) / 2 + 'px'; | 
|                                 // } | 
|                             } else { | 
|                                 uni.showModal({ | 
|                                     title: '裁剪框的宽或高没有设置', | 
|                                     showCancel: false | 
|                                 }) | 
|                                 return; | 
|                             } | 
|                             this.sS = style; | 
|                         } | 
|                         if (this.noBar) { | 
|                             setTimeout(() => { | 
|                                 this.fDrawInit(true); | 
|                             }, 200) | 
|                         } else { | 
|                             uni.hideTabBar({ | 
|                                 complete: () => { | 
|                                     setTimeout(() => { | 
|                                         this.fDrawInit(true); | 
|                                     }, 200) | 
|                                 } | 
|                             }); | 
|                         } | 
|                     }, | 
|                     fail: () => { | 
|                         uni.showToast({ | 
|                             title: "请选择正确图片", | 
|                             duration: 2000, | 
|                         }) | 
|                     }, | 
|                     complete() { | 
|                         uni.hideLoading(); | 
|                     } | 
|                 }); | 
|             }, | 
|             //剪裁确定 | 
|             fUpload() { | 
|                 uni.showLoading({ | 
|                     title: '图片上传中...', | 
|                     mask: true | 
|                 }); | 
|                 if (this.fUploading) return; | 
|                 this.fUploading = true; | 
|                 setTimeout(() => { | 
|                     this.fUploading = false; | 
|                 }, 1000) | 
|                 let style = this.sS, | 
|                     x = parseInt(style.left), | 
|                     y = parseInt(style.top), | 
|                     width = parseInt(style.width), | 
|                     height = parseInt(style.height), | 
|                     expWidth = this.eW || (width * this.pixelRatio), | 
|                     expHeight = this.eH || (height * this.pixelRatio); | 
|                 this.fHideImg(); | 
|                 // #ifndef MP-ALIPAY | 
|                 let phone = uni.getSystemInfoSync().platform | 
|                 if (phone == 'ios') { | 
|                     y = this.sT1num | 
|                 } | 
|                 uni.canvasToTempFilePath({ | 
|                     x: x, | 
|                     y: y, | 
|                     width: width, | 
|                     height: height, | 
|                     destWidth: expWidth, | 
|                     destHeight: expHeight, | 
|                     canvasId: 'avatar-canvas', | 
|                     fileType: this.fType, | 
|                     quality: this.qlty, | 
|                     success: (r) => { | 
|                         r = r.tempFilePath; | 
|                         // #ifndef H5 | 
|                         this.$emit("upload", { | 
|                             avatar: this.imgSrc, | 
|                             path: r, | 
|                             index: this.indx, | 
|                             data: this.rtn, | 
|                             base64: this.base64 || null | 
|                         }); | 
|                         // #endif | 
|                     }, | 
|                     fail: (res) => { | 
|                         uni.showToast({ | 
|                             title: "error1", | 
|                             duration: 2000, | 
|                         }) | 
|                     }, | 
|                     complete: () => { | 
|                         uni.hideLoading(); | 
|                         this.noBar || uni.showTabBar(); | 
|                         this.$emit("end"); | 
|                     } | 
|                 }, this); | 
|                 // #endif | 
|             }, | 
|             fDrawInit(ini = false) { | 
|                 let allWidth = this.wW, //设备宽 | 
|                     allHeight = this.wH, //设备高 | 
|                     imgWidth = this.imgWidth, //图宽 | 
|                     imgHeight = this.imgHeight, //图高 | 
|                     imgRadio = imgWidth / imgHeight, //图比 | 
|                     useWidth = allWidth - 40, //设备宽-40 | 
|                     useHeight = allHeight - tH - 80, //设备高-80 | 
|                     useRadio = useWidth / useHeight, | 
|                     sW = parseInt(this.sS.width), //图片信息 | 
|                     sH = parseInt(this.sS.height); | 
|                 this.fixWidth = 0; | 
|                 this.fixHeight = 0; | 
|                 this.lckWidth = 0; | 
|                 this.lckHeight = 0; | 
|                 switch (this.stc) { //以下是自动铺满的算法 | 
|                     case 'x': | 
|                         this.fixWidth = 1; | 
|                         break; | 
|                     case 'y': | 
|                         this.fixHeight = 1; | 
|                         break; | 
|                     case 'long': | 
|                         if (imgRadio > 1) this.fixWidth = 1; | 
|                         else this.fixHeight = 1; | 
|                         break; | 
|                     case 'short': | 
|                         if (imgRadio > 1) this.fixHeight = 1; | 
|                         else this.fixWidth = 1; | 
|                         break; | 
|                     case 'longSel': | 
|                         if (sW > sH) this.fixWidth = 1; | 
|                         else this.fixHeight = 1; | 
|                         break; | 
|                     case 'shortSel': | 
|                         if (sW > sH) this.fixHeight = 1; | 
|                         else this.fixWidth = 1; | 
|                         break; | 
|                 } | 
|                 switch (this.lck) { //以下锁定屏幕的移动方向 | 
|                     case 'x': | 
|                         this.lckWidth = 1; | 
|                         break; | 
|                     case 'y': | 
|                         this.lckHeight = 1; | 
|                         break; | 
|                     case 'long': | 
|                         if (imgRadio > 1) this.lckWidth = 1; | 
|                         else this.lckHeight = 1; | 
|                         break; | 
|                     case 'short': | 
|                         if (imgRadio > 1) this.lckHeight = 1; | 
|                         else this.lckWidth = 1; | 
|                         break; | 
|                     case 'longSel': | 
|                         if (sW > sH) this.lckWidth = 1; | 
|                         else this.lckHeight = 1; | 
|                         break; | 
|                     case 'shortSel': | 
|                         if (sW > sH) this.lckHeight = 1; | 
|                         else this.lckWidth = 1; | 
|                         break; | 
|                 } | 
|                 if (this.fixWidth) { | 
|                     useWidth = sW; | 
|                     useHeight = useWidth / imgRadio; | 
|                 } else if (this.fixHeight) { | 
|                     useHeight = sH; | 
|                     useWidth = useHeight * imgRadio; | 
|                 } else if (imgRadio < useRadio) { | 
|                     if (imgHeight < useHeight) { | 
|                         useWidth = imgWidth; | 
|                         useHeight = imgHeight; | 
|                     } else { | 
|                         useWidth = useHeight * imgRadio; | 
|                     } | 
|                 } else { | 
|                     if (imgWidth < useWidth) { | 
|                         useWidth = imgWidth; | 
|                         useHeight = imgHeight; | 
|                     } else { | 
|                         useHeight = useWidth / imgRadio; | 
|                     } | 
|                 } | 
|                 if (this.isin) { | 
|                     if (useWidth < sW) { | 
|                         useWidth = sW; | 
|                         useHeight = useWidth / imgRadio; | 
|                         this.lckHeight = 0; | 
|                     } | 
|                     if (useHeight < sH) { | 
|                         useHeight = sH; | 
|                         useWidth = useHeight * imgRadio; | 
|                         this.lckWidth = 0; | 
|                     } | 
|                 } | 
|                 this.scaleSize = 1; | 
|                 this.rotateDeg = 0; | 
|                 this.posWidth = (allWidth - useWidth) / 2 | 0; | 
|                 this.posHeight = (allHeight - useHeight - tH) / 2 | 0; | 
|                 this.useWidth = useWidth | 0; | 
|                 this.useHeight = useHeight | 0; | 
|                 this.centerX = this.posWidth + useWidth / 2; | 
|                 this.centerY = this.posHeight + useHeight / 2; | 
|                 this.focusX = 0; | 
|                 this.focusY = 0; | 
|                 let style = this.sS, | 
|                     left = parseInt(style.left), | 
|                     top = parseInt(style.top), | 
|                     width = parseInt(style.width), | 
|                     height = parseInt(style.height), | 
|                     canvas = this.canvas, | 
|                     canvasOper = this.canvasOper, | 
|                     cc = this.cc, //avatar-canvas | 
|                     cco = this.cco; //oper-canvas  裁剪 | 
|                 cco.beginPath(); //开始创建一个路径 | 
|                 cco.setLineWidth(3); //设置线条的宽度  px | 
|                 cco.setGlobalAlpha(1); //设置全局画笔透明度。 | 
|                 cco.setStrokeStyle('white'); //设置边框颜色。如果没有设置 fillStyle,默认颜色为 black。 | 
|                 cco.strokeRect(left, top, width, height); //画一个矩形(非填充)。用 setFillStroke() 设置边框颜色,如果没设置默认是黑色。 | 
|                 cco.setFillStyle('black'); | 
|                 cco.setGlobalAlpha(0.5); | 
|                 cco.fillRect(0, 0, this.wW, top); //填充一个矩形 | 
|                 cco.fillRect(0, top, left, height); | 
|                 cco.fillRect(0, top + height, this.wW, this.wH - height - top - tH); | 
|                 cco.fillRect(left + width, top, this.wW - width - left, height); | 
|                 cco.setGlobalAlpha(1); | 
|                 cco.setStrokeStyle('red'); | 
|                 cco.moveTo(left + 15, top); //把路径移动到画布中的指定点,不创建线条。用 stroke() 方法来画线条。 | 
|                 cco.lineTo(left, top); //增加一个新点,然后创建一条从上次指定点到目标点的线。 | 
|                 cco.lineTo(left, top + 15); | 
|                 cco.moveTo(left + width - 15, top); | 
|                 cco.lineTo(left + width, top); | 
|                 cco.lineTo(left + width, top + 15); | 
|                 cco.moveTo(left + 15, top + height); | 
|                 cco.lineTo(left, top + height); | 
|                 cco.lineTo(left, top + height - 15); | 
|                 cco.moveTo(left + width - 15, top + height); | 
|                 cco.lineTo(left + width, top + height); | 
|                 cco.lineTo(left + width, top + height - 15); | 
|                 cco.stroke(); //画线条 | 
|                 cco.draw(false, () => { //将之前在绘图上下文中的描述(路径、变形、样式)画到 canvas 中。 | 
|                     if (ini) { | 
|                         this.sT = this.drawTop + 'px'; | 
|                         this.fDrawImage(true); //绘制背景色 | 
|                     } | 
|                 }); | 
|                 this.$emit("init"); | 
|             }, | 
|             //绘制背景色 | 
|             fDrawImage(ini = false) { | 
|                 let tm_now = Date.now(); //当前时间 | 
|                 if (tm_now - this.drawTm < 20) return; | 
|                 this.drawTm = tm_now; | 
|                 let cc = this.cc, | 
|                     imgWidth = this.useWidth * this.scaleSize, | 
|                     imgHeight = this.useHeight * this.scaleSize; | 
|                 if (this.bgImage) { //如果背景图 | 
|                     // #ifndef MP-ALIPAY | 
|                     cc.drawImage(this.bgImage, 0, 0, this.wW, this.wH - tH); //绘制图像到画布。 | 
|                     // #endif | 
|                 } else { | 
|                     cc.fillRect(0, 0, this.wW, this.wH - tH); //填充一个矩形 | 
|                 } | 
|                 if (this.isin) { //禁止旋转并在图片范围内移动 | 
|                     let cx = this.focusX * (this.scaleSize - 1), | 
|                         cy = this.focusY * (this.scaleSize - 1); | 
|                     cc.translate(this.centerX, this.centerY); | 
|                     cc.rotate(this.rotateDeg * Math.PI / 180); | 
|                     cc.drawImage(this.imgPath, this.posWidth - this.centerX - cx, this.posHeight - this.centerY - cy, | 
|                         imgWidth, imgHeight); | 
|                 } else { | 
|                     cc.translate(this.posWidth + imgWidth / 2, this.posHeight + imgHeight / 2); | 
|                     cc.rotate(this.rotateDeg * Math.PI / 180); | 
|                     cc.drawImage(this.imgPath, -imgWidth / 2, -imgHeight / 2, imgWidth, imgHeight); | 
|                 } | 
|                 cc.draw(false); | 
|             }, | 
|             //旋转 | 
|             fRotate() { | 
|                 this.rotateDeg += 90 - this.rotateDeg % 90; | 
|                 this.fDrawImage(); | 
|             }, | 
|             //手指触摸开始 | 
|             fStart(e) { | 
|                 let touches = e.touches, | 
|                     touch0 = touches[0], | 
|                     touch1 = touches[1]; | 
|                 this.touch0 = touch0; | 
|                 this.touch1 = touch1; | 
|                 if (touch1) { | 
|                     let x = touch1.x - touch0.x, | 
|                         y = touch1.y - touch0.y; | 
|                     this.fgDistance = Math.sqrt(x * x + y * y); | 
|                 } | 
|             }, | 
|             //手指触摸后移动 | 
|             fMove(e) { | 
|                 let touches = e.touches, | 
|                     touch0 = touches[0], | 
|                     touch1 = touches[1]; | 
|                 if (touch1) { | 
|                     let x = touch1.x - touch0.x, | 
|                         y = touch1.y - touch0.y, | 
|                         fgDistance = Math.sqrt(x * x + y * y), | 
|                         scaleSize = 0.005 * (fgDistance - this.fgDistance), | 
|                         beScaleSize = this.scaleSize + scaleSize; | 
|                     do { | 
|                         if (!this.letScale) break; | 
|                         if (beScaleSize < this.mnScale) break; | 
|                         if (beScaleSize > this.mxScale) break; | 
|                         let growX = this.useWidth * scaleSize / 2, | 
|                             growY = this.useHeight * scaleSize / 2; | 
|                         if (this.isin) { | 
|                             let imgWidth = this.useWidth * beScaleSize, | 
|                                 imgHeight = this.useHeight * beScaleSize, | 
|                                 l = this.posWidth - growX, | 
|                                 t = this.posHeight - growY, | 
|                                 r = l + imgWidth, | 
|                                 b = t + imgHeight, | 
|                                 left = parseInt(this.sS.left), | 
|                                 top = parseInt(this.sS.top), | 
|                                 width = parseInt(this.sS.width), | 
|                                 height = parseInt(this.sS.height), | 
|                                 right = left + width, | 
|                                 bottom = top + height, | 
|                                 cx, cy; | 
|                             if (imgWidth <= width || imgHeight <= height) break; | 
|                             this.cx = cx = this.focusX * beScaleSize - this.focusX, | 
|                                 this.cy = cy = this.focusY * beScaleSize - this.focusY; | 
|                             this.posWidth -= growX; | 
|                             this.posHeight -= growY; | 
|                             if (this.posWidth - cx > left) { | 
|                                 this.posWidth = left + cx; | 
|                             } | 
|                             if (this.posWidth + imgWidth - cx < right) { | 
|                                 this.posWidth = right - imgWidth + cx; | 
|                             } | 
|                             if (this.posHeight - cy > top) { | 
|                                 this.posHeight = top + cy; | 
|                             } | 
|                             if (this.posHeight + imgHeight - cy < bottom) { | 
|                                 this.posHeight = bottom - imgHeight + cy; | 
|                             } | 
|                         } else { | 
|                             this.posWidth -= growX; | 
|                             this.posHeight -= growY; | 
|                         } | 
|                         this.scaleSize = beScaleSize; | 
|                     } while (0); | 
|                     this.fgDistance = fgDistance; | 
|                     if (touch1.x !== touch0.x && this.letRotate) { | 
|                         x = (this.touch1.y - this.touch0.y) / (this.touch1.x - this.touch0.x); | 
|                         y = (touch1.y - touch0.y) / (touch1.x - touch0.x); | 
|                         this.rotateDeg += Math.atan((y - x) / (1 + x * y)) * 180 / Math.PI; | 
|                         this.touch0 = touch0; | 
|                         this.touch1 = touch1; | 
|                     } | 
|                     this.fDrawImage(); | 
|                 } else if (this.touch0) { | 
|                     let x = touch0.x - this.touch0.x, | 
|                         y = touch0.y - this.touch0.y, | 
|                         beX = this.posWidth + x, | 
|                         beY = this.posHeight + y; | 
|                     if (this.isin) { | 
|                         let imgWidth = this.useWidth * this.scaleSize, | 
|                             imgHeight = this.useHeight * this.scaleSize, | 
|                             l = beX, | 
|                             t = beY, | 
|                             r = l + imgWidth, | 
|                             b = t + imgHeight, | 
|                             left = parseInt(this.sS.left), | 
|                             top = parseInt(this.sS.top), | 
|                             right = left + parseInt(this.sS.width), | 
|                             bottom = top + parseInt(this.sS.height), | 
|                             cx, cy; | 
|                         this.cx = cx = this.focusX * this.scaleSize - this.focusX; | 
|                         this.cy = cy = this.focusY * this.scaleSize - this.focusY; | 
|                         if (!this.lckWidth && Math.abs(x) < 100) { | 
|                             if (left < l - cx) { | 
|                                 this.posWidth = left + cx; | 
|                             } else if (right > r - cx) { | 
|                                 this.posWidth = right - imgWidth + cx; | 
|                             } else { | 
|                                 this.posWidth = beX; | 
|                                 this.focusX -= x; | 
|                             } | 
|                         } | 
|                         if (!this.lckHeight && Math.abs(y) < 100) { | 
|                             if (top < t - cy) { | 
|                                 this.focusY -= (top + cy - this.posHeight); | 
|                                 this.posHeight = top + cy; | 
|                             } else if (bottom > b - cy) { | 
|                                 this.focusY -= (bottom + cy - (this.posHeight + imgHeight)); | 
|                                 this.posHeight = bottom - imgHeight + cy; | 
|                             } else { | 
|                                 this.posHeight = beY; | 
|                                 this.focusY -= y; | 
|                             } | 
|                         } | 
|                     } else { | 
|                         if (Math.abs(x) < 100 && !this.lckWidth) this.posWidth = beX; | 
|                         if (Math.abs(y) < 100 && !this.lckHeight) this.posHeight = beY; | 
|                         this.focusX -= x; | 
|                         this.focusY -= y; | 
|                     } | 
|                     this.touch0 = touch0; | 
|                     this.fDrawImage(); | 
|                 } | 
|             }, | 
|             //手指触摸动作结束 | 
|             fEnd(e) { | 
|                 let touches = e.touches, | 
|                     touch0 = touches && touches[0], | 
|                     touch1 = touches && touches[1]; | 
|                 if (touch0) { | 
|                     this.touch0 = touch0; | 
|                 } else { | 
|                     this.touch0 = null; | 
|                     this.touch1 = null; | 
|                 } | 
|             }, | 
|             fHideImg() { | 
|                 this.prvImg = ''; | 
|                 this.pT = '-10000px'; | 
|                 this.prvImgData = null; | 
|                 this.target = null; | 
|             }, | 
|         } | 
|     } | 
| </script> | 
| <style> | 
|     .croppage { | 
|         width: 100%; | 
|         height: 100%; | 
|         box-sizing: border-box; | 
|         background-color: #000000; | 
|         position: relative; | 
|     } | 
|     .my-canvas { | 
|         /* display: flex; */ | 
|         position: absolute !important; | 
|         left: 0; | 
|         z-index: 100000; | 
|         width: 100%; | 
|     } | 
|     .my-avatar { | 
|         width: 150upx; | 
|         height: 150upx; | 
|         border-radius: 100%; | 
|     } | 
|     .oper-canvas { | 
|         /* display: flex; */ | 
|         position: absolute !important; | 
|         left: 0; | 
|         z-index: 100000; | 
|         width: 100%; | 
|     } | 
|     .prv-canvas { | 
|         display: flex; | 
|         position: fixed !important; | 
|         background: #000000; | 
|         left: 0; | 
|         z-index: 200000; | 
|         width: 100%; | 
|     } | 
|     .oper-wrapper { | 
|         height: 100rpx; | 
|         position: fixed !important; | 
|         box-sizing: border-box; | 
|         border: 1px solid #F1F1F1; | 
|         background: #ffffff; | 
|         width: 100%; | 
|         left: 0; | 
|         bottom: 0; | 
|         z-index: 99999999; | 
|         flex-direction: row; | 
|     } | 
|     .oper { | 
|         display: flex; | 
|         flex-direction: column; | 
|         justify-content: center; | 
|         padding: 10upx 20upx; | 
|         width: 100%; | 
|         height: 100%; | 
|         box-sizing: border-box; | 
|         align-self: center; | 
|     } | 
|     .btn-wrapper { | 
|         display: flex; | 
|         flex-direction: row; | 
|         flex-grow: 1; | 
|         height: 50px; | 
|         justify-content: space-between; | 
|     } | 
|   | 
|     .btn-wrapper view { | 
|         display: flex; | 
|         align-items: center; | 
|         justify-content: center; | 
|         font-size: 16px; | 
|         color: #3b7ffb; | 
|         border-radius: 6%; | 
|     } | 
|     .hover { | 
|         background: #f1f1f1; | 
|         border-radius: 6%; | 
|     } | 
|     .clr-wrapper { | 
|         display: flex; | 
|         flex-direction: row; | 
|         flex-grow: 1; | 
|     } | 
|     .clr-wrapper view { | 
|         display: flex; | 
|         align-items: center; | 
|         justify-content: center; | 
|         font-size: 16px; | 
|         color: #333; | 
|         border: 1px solid #f1f1f1; | 
|         border-radius: 6%; | 
|     } | 
|     .my-slider { | 
|         flex-grow: 1; | 
|     } | 
| </style> |