2025-01-23 09:35:55 +08:00

212 lines
5.7 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

function ImgInfo(params){
this.pageW=params.pageW;
this.pageH=params.pageH;
this.pageScale=this.pageH/this.pageW;
}
ImgInfo.prototype={
constructor:ImgInfo,
reset:function(el){ //重置选中的图片,获取该图片以及它的宽高
this.img=el;
var boundClient=this.img.getBoundingClientRect();
this.scale=boundClient.height/boundClient.width;
this.ifFullByHeight=this.scale>this.pageScale; //true:高度铺满屏幕 false:宽度铺满屏幕
this.ifFullByHeight ? this.setHeight(this.pageH) : this.setWidth(this.pageW);
this.startAnitScale=0.2;
},
setWidth:function(w){ //缩放时候设置宽度
this.w=w;
this.h=this.w*this.scale;
this.x=(this.pageW-this.w)/2;
this.y=(this.pageH-this.h)/2;
},
setHeight:function(w){ //缩放时候设置宽度
this.h=this.pageH;
this.w=this.h/this.scale;
this.y=0;
this.x=(this.pageW-this.w)/2;
},
endScale:function(){
if(this.w>this.pageW||this.h>this.pageH){
return;
}
this.ifFullByHeight ? this.setHeight(this.pageH) : this.setWidth(this.pageW);
},
moveX:function(distX){
//X轴方向的移动
if(this.x>0 || (this.x+this.w)<this.pageW){ //超出屏幕时候弹性回收
this.x+=distX/5;
}
else{
this.x+=distX;
}
},
moveY:function(distY){
//Y轴方向的移动
if(this.h<=this.pageH){
return;
}
if((this.h>this.pageH && this.y>0) || (this.h>this.pageH && (this.y+this.h)<this.pageH)){
this.y+=distY/5;
}
else{
this.y+=distY;
}
},
move:function(distX,distY){
this.moveX(distX);
this.moveY(distY);
},
endMove:function(){
//手指松开的时候X轴回弹
if(this.x>0){
this.x=this.ifFullByHeight&&this.w<this.pageW ? (this.pageW-this.w)/2 : 0;
}
else if((this.x+this.w)<this.pageW){
this.x=this.ifFullByHeight&&this.w<this.pageW ? (this.pageW-this.w)/2 : (this.pageW-this.w);
}
//手指松开的时候Y轴回弹
if(this.h>this.pageH && this.y>0){
this.y=0;
}
else if(this.h>this.pageH && (this.y+this.h)<this.pageH){
this.y=this.pageH-this.h;
}
},
startAnit:function(ctx){ //点击图片放大的动画
var _this=this;
this.startAnitScale+=0.05;
this.startAnitDraw(ctx);
if(this.startAnitScale>=1){
this.startAnitScale=1;
this.startAnitDraw(ctx);
this.startAnitScale=0.2;
return;
}
requestAnimationFrame(function(){
_this.startAnit(ctx);
})
},
startAnitDraw:function(ctx){
ctx.clearRect(0,0,this.pageW,this.pageH);
ctx.save();
var w=this.w*this.startAnitScale;
var h=this.h*this.startAnitScale;
ctx.translate((this.pageW-w)/2,(this.pageH-h)/2);
ctx.beginPath();
ctx.drawImage(this.img,0,0,w,h);
ctx.closePath();
ctx.restore();
},
draw:function(ctx){
ctx.clearRect(0,0,this.pageW,this.pageH);
ctx.save();
ctx.beginPath();
ctx.drawImage(this.img,this.x,this.y,this.w,this.h);
ctx.closePath();
ctx.restore();
}
}
function WxScale(params){
this.moveData={ //单指移动数据
ifStart:false, //是否开始移动
startX:1, //手指开始接触的x坐标
startY:1, //手指开始接触的y坐标
};
this.scaleData={ //双指缩放数据
ifStart:false, //是否开始移动
startDist:1, //手机开始接触时双指的距离,用来计算缩放比例
};
this.init(params);
this.bindEvent();
}
WxScale.prototype={
constructor:WxScale,
init:function(params){
this.fullPage=params.fullPage;
this.canvas=params.canvas;
this.fullPage.style.display="block"; //如果不先显示出fullpage那么会获取不到fullpage的宽高
var clientRect=this.canvas.getBoundingClientRect();
this.w=this.canvas.width=clientRect.width;
this.h=this.canvas.height=clientRect.height;
this.ctx=canvas.getContext("2d");
this.img=new ImgInfo({
pageW:this.w,
pageH:this.h
});
this.fullPage.style.display="none";
},
start:function(el){
this.fullPage.style.display="block";
this.img.reset(el);
this.img.startAnit(this.ctx);
},
bindEvent:function(){
var _this=this;
this.fullPage.addEventListener("touchstart",function(e){
_this.touchstart(e);
},false)
this.fullPage.addEventListener("touchmove",function(e){
_this.touchmove(e);
},false)
this.fullPage.addEventListener("touchend",function(e){
_this.touchend(e);
},false)
this.fullPage.addEventListener("click",function(){
this.style.display="none";
},false)
},
touchstart:function(e){
if(e.touches.length==1){ //单指移动
this.moveData.ifStart=true;
this.moveData.startX=e.touches[0].pageX;
this.moveData.startY=e.touches[0].pageY;
}
else if(e.touches.length>=2){ //双指缩放
this.scaleData.ifStart=true;
this.scaleData.startDist=this.getDistance(e.touches[0],e.touches[1]);
this.imgBaseWidth=this.img.w;
}
},
touchmove:function(e){
e.preventDefault();
if(this.moveData.ifStart&&e.touches.length==1){ //单指移动
var distX=e.touches[0].pageX-this.moveData.startX;
var distY=e.touches[0].pageY-this.moveData.startY;
this.moveData.startX=e.touches[0].pageX;
this.moveData.startY=e.touches[0].pageY;
this.img.move(distX,distY);
}
else if(this.scaleData.ifStart&&e.touches.length>=2){ //双指缩放
var moveDist=this.getDistance(e.touches[0],e.touches[1]);
var scale=(moveDist/this.scaleData.startDist).toFixed(2); //得到缩放比例
this.img.setWidth(this.imgBaseWidth*scale);
}
this.img.draw(this.ctx);
},
touchend:function(e){
if(this.scaleData.ifStart){ //双指缩放
this.scaleData.ifStart=false;
this.moveData.ifStart=false;
this.img.endScale();
this.img.draw(this.ctx);
}
else if(this.moveData.ifStart){ //单指移动
this.moveData.ifStart=false;
this.img.endMove();
this.img.draw(this.ctx);
}
},
getDistance:function(p1, p2){
var x=p2.pageX-p1.pageX,
y=p2.pageY-p1.pageY;
return Math.sqrt(x*x+y*y);
}
}