var startTouchs = [];
|
var touchType = ''
|
var startDistance = 0;
|
var touchCenter = [];
|
var cropperRect = null;
|
var imageRect = null;
|
var directionX = 0;
|
var directionY = 0;
|
var ratio = 0;
|
// 操作时改变的对象
|
var changes = {
|
imageRect: null,
|
cropperRect: null
|
}
|
// 计算旋转后真实的图片大小
|
function getRealSize(){
|
var w = changes.imageRect.width
|
var h = changes.imageRect.height
|
var l = changes.imageRect.left
|
var t = changes.imageRect.top
|
// 内斜边
|
var R = Math.sqrt(w*w+h*h)
|
var angle = Math.atan(h/w) / Math.PI * 180
|
var rorate = rotateAngle%90
|
var direct = Math.floor(rotateAngle/90)
|
var width = R*Math.cos(ang2deg(angle-rorate))
|
var height = R*Math.sin(ang2deg(angle+rorate))
|
if(direct % 2 === 1){
|
var temp = width
|
width = height
|
height = temp
|
}
|
return {
|
width: width,
|
height: height,
|
left: l - (width - w)/2,
|
top: t - (height - h)/2,
|
dw: width - w,
|
dh: height - h
|
}
|
}
|
export default {
|
computed: {
|
imageStyle() {
|
const imageRect = this.imageRect
|
if (imageRect) {
|
return {
|
left: imageRect.left + 'px',
|
top: imageRect.top + 'px',
|
width: imageRect.width + 'px',
|
height: imageRect.height + 'px'
|
}
|
} else {
|
return {}
|
}
|
},
|
cropperStyle() {
|
const cropperRect = this.cropperRect
|
if (cropperRect) {
|
return {
|
left: cropperRect.left + 'px',
|
top: cropperRect.top + 'px',
|
width: cropperRect.width + 'px',
|
height: cropperRect.height + 'px'
|
}
|
} else {
|
return {}
|
}
|
}
|
},
|
methods: {
|
touchStart() {
|
let ev;
|
if (arguments.length == 3) {
|
directionX = arguments[0];
|
directionY = arguments[1];
|
ev = arguments[2];
|
touchType = "controller";
|
} else {
|
touchType = "image";
|
ev = arguments[0];
|
}
|
startTouchs = ev.touches;
|
changes = {
|
imageRect: this.imageRect,
|
cropperRect: this.cropperRect
|
};
|
ratio = this.ratio;
|
cropperRect = {
|
...changes.cropperRect
|
}
|
imageRect = {
|
...changes.imageRect
|
}
|
if (startTouchs.length == 2) {
|
const imageRect = this.imageRect
|
var x1 = startTouchs[0].clientX
|
var y1 = startTouchs[0].clientY
|
var x2 = startTouchs[1].clientX
|
var y2 = startTouchs[1].clientY
|
var distance = Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2)
|
startDistance = Math.sqrt(distance)
|
var leftPercent = ((x1 + x2) / 2 - imageRect.left) / imageRect.width
|
var topPercent = ((y1 + y2) / 2 - imageRect.top) / imageRect.height
|
touchCenter = [leftPercent, topPercent]
|
}
|
},
|
touchMove(ev) {
|
if(startTouchs.length!==ev.touches.length) return
|
var touches = ev.touches;
|
var changeX1 = touches[0].clientX - startTouchs[0].clientX;
|
var changeY1 = touches[0].clientY - startTouchs[0].clientY;
|
if (startTouchs.length == 1) {
|
if (touchType === 'image') {
|
changes.imageRect.left = imageRect.left + changeX1;
|
changes.imageRect.top = imageRect.top + changeY1;
|
// console.log(startTouchs.length,ev.touches.length)
|
} else if (touchType === 'controller') {
|
var changeX = changeX1 * directionX;
|
var changeY = changeY1 * directionY;
|
// 比例缩放控制
|
if (ratio !== 0) {
|
if (directionX * directionY !== 0) {
|
if (changeX / ratio > changeY) {
|
changeY = changeX / ratio
|
changeX = changeY * ratio
|
} else {
|
changeX = changeY * ratio
|
changeY = changeX / ratio
|
}
|
} else {
|
if (directionX == 0) {
|
changeX = changeY * ratio
|
} else {
|
changeY = changeX / ratio
|
}
|
}
|
}
|
var realSize = getRealSize()
|
var width = cropperRect.width + changeX
|
var height = cropperRect.height + changeY
|
var imageRight = realSize.left+realSize.width
|
var imageBottom = realSize.top+realSize.height
|
if (directionX != -1) {
|
if (cropperRect.left + width > imageRight) {
|
width = imageRight - cropperRect.left
|
if (ratio !== 0) {
|
height = width / ratio
|
}
|
}
|
} else {
|
var cLeft = cropperRect.left - changeX
|
if (cLeft < realSize.left) {
|
width = cropperRect.left + cropperRect.width - realSize.left
|
if (ratio !== 0) {
|
height = width / ratio
|
}
|
}
|
}
|
// 判断是否触底
|
if (directionY != -1) {
|
if (cropperRect.top + height > imageBottom) {
|
height = imageBottom - cropperRect.top
|
if (ratio !== 0) {
|
width = height * ratio
|
}
|
}
|
} else {
|
var cTop = cropperRect.top - changeY
|
if (cTop < realSize.top) {
|
height = cropperRect.top + cropperRect.height - realSize.top
|
if (ratio !== 0) {
|
width = height * ratio
|
}
|
}
|
}
|
if (directionX == -1) {
|
changes.cropperRect.left = cropperRect.left + cropperRect.width - width
|
}
|
if (directionY == -1) {
|
changes.cropperRect.top = cropperRect.top + cropperRect.height - height
|
}
|
// 边界控制
|
changes.cropperRect.width = width
|
changes.cropperRect.height = height
|
}
|
} else if (touches.length == 2 && startTouchs.length == 2) {
|
var changeX2 = touches[0].clientX - touches[1].clientX;
|
var changeY2 = touches[0].clientY - touches[1].clientY;
|
var distance = Math.pow(changeX2, 2) + Math.pow(changeY2, 2)
|
distance = Math.sqrt(distance)
|
// 放大比例
|
var scaleRate = distance / startDistance
|
this.imageScale(scaleRate)
|
}
|
},
|
touchEnd(ev) {
|
// console.log('end',ev)
|
if(ev.touches.length!==0) return
|
if (touchType === "image") {
|
var cropperLeft = cropperRect.left
|
var cropperRight = cropperRect.left + cropperRect.width
|
var cropperTop = cropperRect.top
|
var cropperBottom = cropperTop + cropperRect.height
|
var cropperRate = cropperRect.width / cropperRect.height
|
var realSize = getRealSize()
|
var rate = realSize.width / realSize.height
|
if (realSize.width < cropperRect.width || realSize.height < cropperRect.height) {
|
var scale = 1
|
if (rate < cropperRate) {
|
scale = cropperRect.width / realSize.width
|
} else {
|
scale = cropperRect.height / realSize.height
|
}
|
imageRect.width = changes.imageRect.width
|
imageRect.height = changes.imageRect.height
|
this.imageScale(scale)
|
}
|
// 边界控制start
|
if (cropperLeft < realSize.left) {
|
changes.imageRect.left = cropperLeft + realSize.dw/2
|
}
|
if (cropperRight > realSize.left + realSize.width) {
|
changes.imageRect.left = cropperRight - realSize.width + realSize.dw/2
|
}
|
if (cropperTop < realSize.top) {
|
changes.imageRect.top = cropperTop + realSize.dh/2
|
}
|
if (cropperBottom > realSize.top + realSize.height) {
|
changes.imageRect.top = cropperBottom - realSize.height + realSize.dh/2
|
}
|
// 边界控制end
|
}
|
this.updateData({
|
cropperRect: changes.cropperRect,
|
imageRect: changes.imageRect,
|
})
|
touchType = ""
|
startTouchs = []
|
return false;
|
},
|
imageScale(scaleRate) {
|
var cw = imageRect.width * (scaleRate - 1)
|
var ch = imageRect.height * (scaleRate - 1)
|
changes.imageRect = {
|
width: imageRect.width + cw,
|
height: imageRect.height + ch,
|
left: imageRect.left - cw * (touchCenter[0]),
|
top: imageRect.top - ch * (touchCenter[1])
|
}
|
}
|
}
|
}
|