370 lines
9.6 KiB
JavaScript
370 lines
9.6 KiB
JavaScript
|
//>>built
|
||
|
define(["dijit","dojo","dojox","dojo/require!dojox/mobile/app/_Widget,dojo/fx/easing"],function(_1,_2,_3){
|
||
|
_2.provide("dojox.mobile.app.ImageView");
|
||
|
_2.experimental("dojox.mobile.app.ImageView");
|
||
|
_2.require("dojox.mobile.app._Widget");
|
||
|
_2.require("dojo.fx.easing");
|
||
|
_2.declare("dojox.mobile.app.ImageView",_3.mobile.app._Widget,{zoom:1,zoomCenterX:0,zoomCenterY:0,maxZoom:5,autoZoomLevel:3,disableAutoZoom:false,disableSwipe:false,autoZoomEvent:null,_leftImg:null,_centerImg:null,_rightImg:null,_leftSmallImg:null,_centerSmallImg:null,_rightSmallImg:null,constructor:function(){
|
||
|
this.panX=0;
|
||
|
this.panY=0;
|
||
|
this.handleLoad=_2.hitch(this,this.handleLoad);
|
||
|
this._updateAnimatedZoom=_2.hitch(this,this._updateAnimatedZoom);
|
||
|
this._updateAnimatedPan=_2.hitch(this,this._updateAnimatedPan);
|
||
|
this._onAnimPanEnd=_2.hitch(this,this._onAnimPanEnd);
|
||
|
},buildRendering:function(){
|
||
|
this.inherited(arguments);
|
||
|
this.canvas=_2.create("canvas",{},this.domNode);
|
||
|
_2.addClass(this.domNode,"mblImageView");
|
||
|
},postCreate:function(){
|
||
|
this.inherited(arguments);
|
||
|
this.size=_2.marginBox(this.domNode);
|
||
|
_2.style(this.canvas,{width:this.size.w+"px",height:this.size.h+"px"});
|
||
|
this.canvas.height=this.size.h;
|
||
|
this.canvas.width=this.size.w;
|
||
|
var _4=this;
|
||
|
this.connect(this.domNode,"onmousedown",function(_5){
|
||
|
if(_4.isAnimating()){
|
||
|
return;
|
||
|
}
|
||
|
if(_4.panX){
|
||
|
_4.handleDragEnd();
|
||
|
}
|
||
|
_4.downX=_5.targetTouches?_5.targetTouches[0].clientX:_5.clientX;
|
||
|
_4.downY=_5.targetTouches?_5.targetTouches[0].clientY:_5.clientY;
|
||
|
});
|
||
|
this.connect(this.domNode,"onmousemove",function(_6){
|
||
|
if(_4.isAnimating()){
|
||
|
return;
|
||
|
}
|
||
|
if((!_4.downX&&_4.downX!==0)||(!_4.downY&&_4.downY!==0)){
|
||
|
return;
|
||
|
}
|
||
|
if((!_4.disableSwipe&&_4.zoom==1)||(!_4.disableAutoZoom&&_4.zoom!=1)){
|
||
|
var x=_6.targetTouches?_6.targetTouches[0].clientX:_6.pageX;
|
||
|
var y=_6.targetTouches?_6.targetTouches[0].clientY:_6.pageY;
|
||
|
_4.panX=x-_4.downX;
|
||
|
_4.panY=y-_4.downY;
|
||
|
if(_4.zoom==1){
|
||
|
if(Math.abs(_4.panX)>10){
|
||
|
_4.render();
|
||
|
}
|
||
|
}else{
|
||
|
if(Math.abs(_4.panX)>10||Math.abs(_4.panY)>10){
|
||
|
_4.render();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
this.connect(this.domNode,"onmouseout",function(_7){
|
||
|
if(!_4.isAnimating()&&_4.panX){
|
||
|
_4.handleDragEnd();
|
||
|
}
|
||
|
});
|
||
|
this.connect(this.domNode,"onmouseover",function(_8){
|
||
|
_4.downX=_4.downY=null;
|
||
|
});
|
||
|
this.connect(this.domNode,"onclick",function(_9){
|
||
|
if(_4.isAnimating()){
|
||
|
return;
|
||
|
}
|
||
|
if(_4.downX==null||_4.downY==null){
|
||
|
return;
|
||
|
}
|
||
|
var x=(_9.targetTouches?_9.targetTouches[0].clientX:_9.pageX);
|
||
|
var y=(_9.targetTouches?_9.targetTouches[0].clientY:_9.pageY);
|
||
|
if(Math.abs(_4.panX)>14||Math.abs(_4.panY)>14){
|
||
|
_4.downX=_4.downY=null;
|
||
|
_4.handleDragEnd();
|
||
|
return;
|
||
|
}
|
||
|
_4.downX=_4.downY=null;
|
||
|
if(!_4.disableAutoZoom){
|
||
|
if(!_4._centerImg||!_4._centerImg._loaded){
|
||
|
return;
|
||
|
}
|
||
|
if(_4.zoom!=1){
|
||
|
_4.set("animatedZoom",1);
|
||
|
return;
|
||
|
}
|
||
|
var _a=_2._abs(_4.domNode);
|
||
|
var _b=_4.size.w/_4._centerImg.width;
|
||
|
var _c=_4.size.h/_4._centerImg.height;
|
||
|
_4.zoomTo(((x-_a.x)/_b)-_4.panX,((y-_a.y)/_c)-_4.panY,_4.autoZoomLevel);
|
||
|
}
|
||
|
});
|
||
|
_2.connect(this.domNode,"flick",this,"handleFlick");
|
||
|
},isAnimating:function(){
|
||
|
return this._anim&&this._anim.status()=="playing";
|
||
|
},handleDragEnd:function(){
|
||
|
this.downX=this.downY=null;
|
||
|
if(this.zoom==1){
|
||
|
if(!this.panX){
|
||
|
return;
|
||
|
}
|
||
|
var _d=(this._leftImg&&this._leftImg._loaded)||(this._leftSmallImg&&this._leftSmallImg._loaded);
|
||
|
var _e=(this._rightImg&&this._rightImg._loaded)||(this._rightSmallImg&&this._rightSmallImg._loaded);
|
||
|
var _f=!(Math.abs(this.panX)<this._centerImg._baseWidth/2)&&((this.panX>0&&_d?1:0)||(this.panX<0&&_e?1:0));
|
||
|
if(!_f){
|
||
|
this._animPanTo(0,_2.fx.easing.expoOut,700);
|
||
|
}else{
|
||
|
this.moveTo(this.panX);
|
||
|
}
|
||
|
}else{
|
||
|
if(!this.panX&&!this.panY){
|
||
|
return;
|
||
|
}
|
||
|
this.zoomCenterX-=(this.panX/this.zoom);
|
||
|
this.zoomCenterY-=(this.panY/this.zoom);
|
||
|
this.panX=this.panY=0;
|
||
|
}
|
||
|
},handleFlick:function(_10){
|
||
|
if(this.zoom==1&&_10.duration<500){
|
||
|
if(_10.direction=="ltr"){
|
||
|
this.moveTo(1);
|
||
|
}else{
|
||
|
if(_10.direction=="rtl"){
|
||
|
this.moveTo(-1);
|
||
|
}
|
||
|
}
|
||
|
this.downX=this.downY=null;
|
||
|
}
|
||
|
},moveTo:function(_11){
|
||
|
_11=_11>0?1:-1;
|
||
|
var _12;
|
||
|
if(_11<1){
|
||
|
if(this._rightImg&&this._rightImg._loaded){
|
||
|
_12=this._rightImg;
|
||
|
}else{
|
||
|
if(this._rightSmallImg&&this._rightSmallImg._loaded){
|
||
|
_12=this._rightSmallImg;
|
||
|
}
|
||
|
}
|
||
|
}else{
|
||
|
if(this._leftImg&&this._leftImg._loaded){
|
||
|
_12=this._leftImg;
|
||
|
}else{
|
||
|
if(this._leftSmallImg&&this._leftSmallImg._loaded){
|
||
|
_12=this._leftSmallImg;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
this._moveDir=_11;
|
||
|
var _13=this;
|
||
|
if(_12&&_12._loaded){
|
||
|
this._animPanTo(this.size.w*_11,null,500,function(){
|
||
|
_13.panX=0;
|
||
|
_13.panY=0;
|
||
|
if(_11<0){
|
||
|
_13._switchImage("left","right");
|
||
|
}else{
|
||
|
_13._switchImage("right","left");
|
||
|
}
|
||
|
_13.render();
|
||
|
_13.onChange(_11*-1);
|
||
|
});
|
||
|
}else{
|
||
|
this._animPanTo(0,_2.fx.easing.expoOut,700);
|
||
|
}
|
||
|
},_switchImage:function(_14,_15){
|
||
|
var _16="_"+_14+"SmallImg";
|
||
|
var _17="_"+_14+"Img";
|
||
|
var _18="_"+_15+"SmallImg";
|
||
|
var _19="_"+_15+"Img";
|
||
|
this[_17]=this._centerImg;
|
||
|
this[_16]=this._centerSmallImg;
|
||
|
this[_17]._type=_14;
|
||
|
if(this[_16]){
|
||
|
this[_16]._type=_14;
|
||
|
}
|
||
|
this._centerImg=this[_19];
|
||
|
this._centerSmallImg=this[_18];
|
||
|
this._centerImg._type="center";
|
||
|
if(this._centerSmallImg){
|
||
|
this._centerSmallImg._type="center";
|
||
|
}
|
||
|
this[_19]=this[_18]=null;
|
||
|
},_animPanTo:function(to,_1a,_1b,_1c){
|
||
|
this._animCallback=_1c;
|
||
|
this._anim=new _2.Animation({curve:[this.panX,to],onAnimate:this._updateAnimatedPan,duration:_1b||500,easing:_1a,onEnd:this._onAnimPanEnd});
|
||
|
this._anim.play();
|
||
|
return this._anim;
|
||
|
},onChange:function(_1d){
|
||
|
},_updateAnimatedPan:function(_1e){
|
||
|
this.panX=_1e;
|
||
|
this.render();
|
||
|
},_onAnimPanEnd:function(){
|
||
|
this.panX=this.panY=0;
|
||
|
if(this._animCallback){
|
||
|
this._animCallback();
|
||
|
}
|
||
|
},zoomTo:function(_1f,_20,_21){
|
||
|
this.set("zoomCenterX",_1f);
|
||
|
this.set("zoomCenterY",_20);
|
||
|
this.set("animatedZoom",_21);
|
||
|
},render:function(){
|
||
|
var cxt=this.canvas.getContext("2d");
|
||
|
cxt.clearRect(0,0,this.canvas.width,this.canvas.height);
|
||
|
this._renderImg(this._centerSmallImg,this._centerImg,this.zoom==1?(this.panX<0?1:this.panX>0?-1:0):0);
|
||
|
if(this.zoom==1&&this.panX!=0){
|
||
|
if(this.panX>0){
|
||
|
this._renderImg(this._leftSmallImg,this._leftImg,1);
|
||
|
}else{
|
||
|
this._renderImg(this._rightSmallImg,this._rightImg,-1);
|
||
|
}
|
||
|
}
|
||
|
},_renderImg:function(_22,_23,_24){
|
||
|
var img=(_23&&_23._loaded)?_23:_22;
|
||
|
if(!img||!img._loaded){
|
||
|
return;
|
||
|
}
|
||
|
var cxt=this.canvas.getContext("2d");
|
||
|
var _25=img._baseWidth;
|
||
|
var _26=img._baseHeight;
|
||
|
var _27=_25*this.zoom;
|
||
|
var _28=_26*this.zoom;
|
||
|
var _29=Math.min(this.size.w,_27);
|
||
|
var _2a=Math.min(this.size.h,_28);
|
||
|
var _2b=this.dispWidth=img.width*(_29/_27);
|
||
|
var _2c=this.dispHeight=img.height*(_2a/_28);
|
||
|
var _2d=this.zoomCenterX-(this.panX/this.zoom);
|
||
|
var _2e=this.zoomCenterY-(this.panY/this.zoom);
|
||
|
var _2f=Math.floor(Math.max(_2b/2,Math.min(img.width-_2b/2,_2d)));
|
||
|
var _30=Math.floor(Math.max(_2c/2,Math.min(img.height-_2c/2,_2e)));
|
||
|
var _31=Math.max(0,Math.round((img.width-_2b)/2+(_2f-img._centerX)));
|
||
|
var _32=Math.max(0,Math.round((img.height-_2c)/2+(_30-img._centerY)));
|
||
|
var _33=Math.round(Math.max(0,this.canvas.width-_29)/2);
|
||
|
var _34=Math.round(Math.max(0,this.canvas.height-_2a)/2);
|
||
|
var _35=_29;
|
||
|
var _36=_2b;
|
||
|
if(this.zoom==1&&_24&&this.panX){
|
||
|
if(this.panX<0){
|
||
|
if(_24>0){
|
||
|
_29-=Math.abs(this.panX);
|
||
|
_33=0;
|
||
|
}else{
|
||
|
if(_24<0){
|
||
|
_29=Math.max(1,Math.abs(this.panX)-5);
|
||
|
_33=this.size.w-_29;
|
||
|
}
|
||
|
}
|
||
|
}else{
|
||
|
if(_24>0){
|
||
|
_29=Math.max(1,Math.abs(this.panX)-5);
|
||
|
_33=0;
|
||
|
}else{
|
||
|
if(_24<0){
|
||
|
_29-=Math.abs(this.panX);
|
||
|
_33=this.size.w-_29;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
_2b=Math.max(1,Math.floor(_2b*(_29/_35)));
|
||
|
if(_24>0){
|
||
|
_31=(_31+_36)-(_2b);
|
||
|
}
|
||
|
_31=Math.floor(_31);
|
||
|
}
|
||
|
try{
|
||
|
cxt.drawImage(img,Math.max(0,_31),_32,Math.min(_36,_2b),_2c,_33,_34,Math.min(_35,_29),_2a);
|
||
|
}
|
||
|
catch(e){
|
||
|
}
|
||
|
},_setZoomAttr:function(_37){
|
||
|
this.zoom=Math.min(this.maxZoom,Math.max(1,_37));
|
||
|
if(this.zoom==1&&this._centerImg&&this._centerImg._loaded){
|
||
|
if(!this.isAnimating()){
|
||
|
this.zoomCenterX=this._centerImg.width/2;
|
||
|
this.zoomCenterY=this._centerImg.height/2;
|
||
|
}
|
||
|
this.panX=this.panY=0;
|
||
|
}
|
||
|
this.render();
|
||
|
},_setZoomCenterXAttr:function(_38){
|
||
|
if(_38!=this.zoomCenterX){
|
||
|
if(this._centerImg&&this._centerImg._loaded){
|
||
|
_38=Math.min(this._centerImg.width,_38);
|
||
|
}
|
||
|
this.zoomCenterX=Math.max(0,Math.round(_38));
|
||
|
}
|
||
|
},_setZoomCenterYAttr:function(_39){
|
||
|
if(_39!=this.zoomCenterY){
|
||
|
if(this._centerImg&&this._centerImg._loaded){
|
||
|
_39=Math.min(this._centerImg.height,_39);
|
||
|
}
|
||
|
this.zoomCenterY=Math.max(0,Math.round(_39));
|
||
|
}
|
||
|
},_setZoomCenterAttr:function(_3a){
|
||
|
if(_3a.x!=this.zoomCenterX||_3a.y!=this.zoomCenterY){
|
||
|
this.set("zoomCenterX",_3a.x);
|
||
|
this.set("zoomCenterY",_3a.y);
|
||
|
this.render();
|
||
|
}
|
||
|
},_setAnimatedZoomAttr:function(_3b){
|
||
|
if(this._anim&&this._anim.status()=="playing"){
|
||
|
return;
|
||
|
}
|
||
|
this._anim=new _2.Animation({curve:[this.zoom,_3b],onAnimate:this._updateAnimatedZoom,onEnd:this._onAnimEnd});
|
||
|
this._anim.play();
|
||
|
},_updateAnimatedZoom:function(_3c){
|
||
|
this._setZoomAttr(_3c);
|
||
|
},_setCenterUrlAttr:function(_3d){
|
||
|
this._setImage("center",_3d);
|
||
|
},_setLeftUrlAttr:function(_3e){
|
||
|
this._setImage("left",_3e);
|
||
|
},_setRightUrlAttr:function(_3f){
|
||
|
this._setImage("right",_3f);
|
||
|
},_setImage:function(_40,_41){
|
||
|
var _42=null;
|
||
|
var _43=null;
|
||
|
if(_2.isString(_41)){
|
||
|
_43=_41;
|
||
|
}else{
|
||
|
_43=_41.large;
|
||
|
_42=_41.small;
|
||
|
}
|
||
|
if(this["_"+_40+"Img"]&&this["_"+_40+"Img"]._src==_43){
|
||
|
return;
|
||
|
}
|
||
|
var _44=this["_"+_40+"Img"]=new Image();
|
||
|
_44._type=_40;
|
||
|
_44._loaded=false;
|
||
|
_44._src=_43;
|
||
|
_44._conn=_2.connect(_44,"onload",this.handleLoad);
|
||
|
if(_42){
|
||
|
var _45=this["_"+_40+"SmallImg"]=new Image();
|
||
|
_45._type=_40;
|
||
|
_45._loaded=false;
|
||
|
_45._conn=_2.connect(_45,"onload",this.handleLoad);
|
||
|
_45._isSmall=true;
|
||
|
_45._src=_42;
|
||
|
_45.src=_42;
|
||
|
}
|
||
|
_44.src=_43;
|
||
|
},handleLoad:function(evt){
|
||
|
var img=evt.target;
|
||
|
img._loaded=true;
|
||
|
_2.disconnect(img._conn);
|
||
|
var _46=img._type;
|
||
|
switch(_46){
|
||
|
case "center":
|
||
|
this.zoomCenterX=img.width/2;
|
||
|
this.zoomCenterY=img.height/2;
|
||
|
break;
|
||
|
}
|
||
|
var _47=img.height;
|
||
|
var _48=img.width;
|
||
|
if(_48/this.size.w<_47/this.size.h){
|
||
|
img._baseHeight=this.canvas.height;
|
||
|
img._baseWidth=_48/(_47/this.size.h);
|
||
|
}else{
|
||
|
img._baseWidth=this.canvas.width;
|
||
|
img._baseHeight=_47/(_48/this.size.w);
|
||
|
}
|
||
|
img._centerX=_48/2;
|
||
|
img._centerY=_47/2;
|
||
|
this.render();
|
||
|
this.onLoad(img._type,img._src,img._isSmall);
|
||
|
},onLoad:function(_49,url,_4a){
|
||
|
}});
|
||
|
});
|