root / trunk / web / dojo / dojox / mobile / app / ImageView.js
History | View | Annotate | Download (9.8 KB)
1 | 9 | andrej.cim | /*
|
---|---|---|---|
2 | Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
|
||
3 | Available via Academic Free License >= 2.1 OR the modified BSD license.
|
||
4 | see: http://dojotoolkit.org/license for details
|
||
5 | */
|
||
6 | |||
7 | |||
8 | if(!dojo._hasResource["dojox.mobile.app.ImageView"]){ |
||
9 | dojo._hasResource["dojox.mobile.app.ImageView"]=true; |
||
10 | dojo.provide("dojox.mobile.app.ImageView");
|
||
11 | dojo.experimental("dojox.mobile.app.ImageView");
|
||
12 | dojo.require("dojox.mobile.app._Widget");
|
||
13 | dojo.require("dojo.fx.easing");
|
||
14 | dojo.declare("dojox.mobile.app.ImageView",dojox.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(){ |
||
15 | this.panX=0; |
||
16 | this.panY=0; |
||
17 | this.handleLoad=dojo.hitch(this,this.handleLoad); |
||
18 | this._updateAnimatedZoom=dojo.hitch(this,this._updateAnimatedZoom); |
||
19 | this._updateAnimatedPan=dojo.hitch(this,this._updateAnimatedPan); |
||
20 | this._onAnimPanEnd=dojo.hitch(this,this._onAnimPanEnd); |
||
21 | },buildRendering:function(){ |
||
22 | this.inherited(arguments); |
||
23 | this.canvas=dojo.create("canvas",{},this.domNode); |
||
24 | dojo.addClass(this.domNode,"mblImageView"); |
||
25 | },postCreate:function(){ |
||
26 | this.inherited(arguments); |
||
27 | this.size=dojo.marginBox(this.domNode); |
||
28 | dojo.style(this.canvas,{width:this.size.w+"px",height:this.size.h+"px"}); |
||
29 | this.canvas.height=this.size.h; |
||
30 | this.canvas.width=this.size.w; |
||
31 | var _1=this; |
||
32 | this.connect(this.domNode,"onmousedown",function(_2){ |
||
33 | if(_1.isAnimating()){
|
||
34 | return;
|
||
35 | } |
||
36 | if(_1.panX){
|
||
37 | _1.handleDragEnd(); |
||
38 | } |
||
39 | _1.downX=_2.targetTouches?_2.targetTouches[0].clientX:_2.clientX;
|
||
40 | _1.downY=_2.targetTouches?_2.targetTouches[0].clientY:_2.clientY;
|
||
41 | }); |
||
42 | this.connect(this.domNode,"onmousemove",function(_3){ |
||
43 | if(_1.isAnimating()){
|
||
44 | return;
|
||
45 | } |
||
46 | if((!_1.downX&&_1.downX!==0)||(!_1.downY&&_1.downY!==0)){ |
||
47 | return;
|
||
48 | } |
||
49 | if((!_1.disableSwipe&&_1.zoom==1)||(!_1.disableAutoZoom&&_1.zoom!=1)){ |
||
50 | var x=_3.targetTouches?_3.targetTouches[0].clientX:_3.pageX; |
||
51 | var y=_3.targetTouches?_3.targetTouches[0].clientY:_3.pageY; |
||
52 | _1.panX=x-_1.downX; |
||
53 | _1.panY=y-_1.downY; |
||
54 | if(_1.zoom==1){ |
||
55 | if(Math.abs(_1.panX)>10){ |
||
56 | _1.render(); |
||
57 | } |
||
58 | }else{
|
||
59 | if(Math.abs(_1.panX)>10||Math.abs(_1.panY)>10){ |
||
60 | _1.render(); |
||
61 | } |
||
62 | } |
||
63 | } |
||
64 | }); |
||
65 | this.connect(this.domNode,"onmouseout",function(_4){ |
||
66 | if(!_1.isAnimating()&&_1.panX){
|
||
67 | _1.handleDragEnd(); |
||
68 | } |
||
69 | }); |
||
70 | this.connect(this.domNode,"onmouseover",function(_5){ |
||
71 | _1.downX=_1.downY=null;
|
||
72 | }); |
||
73 | this.connect(this.domNode,"onclick",function(_6){ |
||
74 | if(_1.isAnimating()){
|
||
75 | return;
|
||
76 | } |
||
77 | if(_1.downX==null||_1.downY==null){ |
||
78 | return;
|
||
79 | } |
||
80 | var x=(_6.targetTouches?_6.targetTouches[0].clientX:_6.pageX); |
||
81 | var y=(_6.targetTouches?_6.targetTouches[0].clientY:_6.pageY); |
||
82 | if(Math.abs(_1.panX)>14||Math.abs(_1.panY)>14){ |
||
83 | _1.downX=_1.downY=null;
|
||
84 | _1.handleDragEnd(); |
||
85 | return;
|
||
86 | } |
||
87 | _1.downX=_1.downY=null;
|
||
88 | if(!_1.disableAutoZoom){
|
||
89 | if(!_1._centerImg||!_1._centerImg._loaded){
|
||
90 | return;
|
||
91 | } |
||
92 | if(_1.zoom!=1){ |
||
93 | _1.set("animatedZoom",1); |
||
94 | return;
|
||
95 | } |
||
96 | var _7=dojo._abs(_1.domNode);
|
||
97 | var _8=_1.size.w/_1._centerImg.width;
|
||
98 | var _9=_1.size.h/_1._centerImg.height;
|
||
99 | _1.zoomTo(((x-_7.x)/_8)-_1.panX,((y-_7.y)/_9)-_1.panY,_1.autoZoomLevel); |
||
100 | } |
||
101 | }); |
||
102 | dojo.connect(this.domNode,"flick",this,"handleFlick"); |
||
103 | },isAnimating:function(){ |
||
104 | return this._anim&&this._anim.status()=="playing"; |
||
105 | },handleDragEnd:function(){ |
||
106 | this.downX=this.downY=null; |
||
107 | if(this.zoom==1){ |
||
108 | if(!this.panX){ |
||
109 | return;
|
||
110 | } |
||
111 | var _a=(this._leftImg&&this._leftImg._loaded)||(this._leftSmallImg&&this._leftSmallImg._loaded); |
||
112 | var _b=(this._rightImg&&this._rightImg._loaded)||(this._rightSmallImg&&this._rightSmallImg._loaded); |
||
113 | var _c=!(Math.abs(this.panX)<this._centerImg._baseWidth/2)&&((this.panX>0&&_a?1:0)||(this.panX<0&&_b?1:0)); |
||
114 | if(!_c){
|
||
115 | this._animPanTo(0,dojo.fx.easing.expoOut,700); |
||
116 | }else{
|
||
117 | this.moveTo(this.panX); |
||
118 | } |
||
119 | }else{
|
||
120 | if(!this.panX&&!this.panY){ |
||
121 | return;
|
||
122 | } |
||
123 | this.zoomCenterX-=(this.panX/this.zoom); |
||
124 | this.zoomCenterY-=(this.panY/this.zoom); |
||
125 | this.panX=this.panY=0; |
||
126 | } |
||
127 | },handleFlick:function(_d){ |
||
128 | if(this.zoom==1&&_d.duration<500){ |
||
129 | if(_d.direction=="ltr"){ |
||
130 | this.moveTo(1); |
||
131 | }else{
|
||
132 | if(_d.direction=="rtl"){ |
||
133 | this.moveTo(-1); |
||
134 | } |
||
135 | } |
||
136 | this.downX=this.downY=null; |
||
137 | } |
||
138 | },moveTo:function(_e){ |
||
139 | _e=_e>0?1:-1; |
||
140 | var _f;
|
||
141 | if(_e<1){ |
||
142 | if(this._rightImg&&this._rightImg._loaded){ |
||
143 | _f=this._rightImg;
|
||
144 | }else{
|
||
145 | if(this._rightSmallImg&&this._rightSmallImg._loaded){ |
||
146 | _f=this._rightSmallImg;
|
||
147 | } |
||
148 | } |
||
149 | }else{
|
||
150 | if(this._leftImg&&this._leftImg._loaded){ |
||
151 | _f=this._leftImg;
|
||
152 | }else{
|
||
153 | if(this._leftSmallImg&&this._leftSmallImg._loaded){ |
||
154 | _f=this._leftSmallImg;
|
||
155 | } |
||
156 | } |
||
157 | } |
||
158 | this._moveDir=_e;
|
||
159 | var _10=this; |
||
160 | if(_f&&_f._loaded){
|
||
161 | this._animPanTo(this.size.w*_e,null,500,function(){ |
||
162 | _10.panX=0;
|
||
163 | _10.panY=0;
|
||
164 | if(_e<0){ |
||
165 | _10._switchImage("left","right"); |
||
166 | }else{
|
||
167 | _10._switchImage("right","left"); |
||
168 | } |
||
169 | _10.render(); |
||
170 | _10.onChange(_e*-1);
|
||
171 | }); |
||
172 | }else{
|
||
173 | this._animPanTo(0,dojo.fx.easing.expoOut,700); |
||
174 | } |
||
175 | },_switchImage:function(_11,_12){ |
||
176 | var _13="_"+_11+"SmallImg"; |
||
177 | var _14="_"+_11+"Img"; |
||
178 | var _15="_"+_12+"SmallImg"; |
||
179 | var _16="_"+_12+"Img"; |
||
180 | this[_14]=this._centerImg; |
||
181 | this[_13]=this._centerSmallImg; |
||
182 | this[_14]._type=_11;
|
||
183 | if(this[_13]){ |
||
184 | this[_13]._type=_11;
|
||
185 | } |
||
186 | this._centerImg=this[_16]; |
||
187 | this._centerSmallImg=this[_15]; |
||
188 | this._centerImg._type="center"; |
||
189 | if(this._centerSmallImg){ |
||
190 | this._centerSmallImg._type="center"; |
||
191 | } |
||
192 | this[_16]=this[_15]=null; |
||
193 | },_animPanTo:function(to,_17,_18,_19){ |
||
194 | this._animCallback=_19;
|
||
195 | this._anim=new dojo.Animation({curve:[this.panX,to],onAnimate:this._updateAnimatedPan,duration:_18||500,easing:_17,onEnd:this._onAnimPanEnd}); |
||
196 | this._anim.play();
|
||
197 | return this._anim; |
||
198 | },onChange:function(_1a){ |
||
199 | },_updateAnimatedPan:function(_1b){ |
||
200 | this.panX=_1b;
|
||
201 | this.render();
|
||
202 | },_onAnimPanEnd:function(){ |
||
203 | this.panX=this.panY=0; |
||
204 | if(this._animCallback){ |
||
205 | this._animCallback();
|
||
206 | } |
||
207 | },zoomTo:function(_1c,_1d,_1e){ |
||
208 | this.set("zoomCenterX",_1c); |
||
209 | this.set("zoomCenterY",_1d); |
||
210 | this.set("animatedZoom",_1e); |
||
211 | },render:function(){ |
||
212 | var cxt=this.canvas.getContext("2d"); |
||
213 | cxt.clearRect(0,0,this.canvas.width,this.canvas.height); |
||
214 | this._renderImg(this._centerSmallImg,this._centerImg,this.zoom==1?(this.panX<0?1:this.panX>0?-1:0):0); |
||
215 | if(this.zoom==1&&this.panX!=0){ |
||
216 | if(this.panX>0){ |
||
217 | this._renderImg(this._leftSmallImg,this._leftImg,1); |
||
218 | }else{
|
||
219 | this._renderImg(this._rightSmallImg,this._rightImg,-1); |
||
220 | } |
||
221 | } |
||
222 | },_renderImg:function(_1f,_20,_21){ |
||
223 | var img=(_20&&_20._loaded)?_20:_1f;
|
||
224 | if(!img||!img._loaded){
|
||
225 | return;
|
||
226 | } |
||
227 | var cxt=this.canvas.getContext("2d"); |
||
228 | var _22=img._baseWidth;
|
||
229 | var _23=img._baseHeight;
|
||
230 | var _24=_22*this.zoom; |
||
231 | var _25=_23*this.zoom; |
||
232 | var _26=Math.min(this.size.w,_24); |
||
233 | var _27=Math.min(this.size.h,_25); |
||
234 | var _28=this.dispWidth=img.width*(_26/_24); |
||
235 | var _29=this.dispHeight=img.height*(_27/_25); |
||
236 | var _2a=this.zoomCenterX-(this.panX/this.zoom); |
||
237 | var _2b=this.zoomCenterY-(this.panY/this.zoom); |
||
238 | var _2c=Math.floor(Math.max(_28/2,Math.min(img.width-_28/2,_2a))); |
||
239 | var _2d=Math.floor(Math.max(_29/2,Math.min(img.height-_29/2,_2b))); |
||
240 | var _2e=Math.max(0,Math.round((img.width-_28)/2+(_2c-img._centerX))); |
||
241 | var _2f=Math.max(0,Math.round((img.height-_29)/2+(_2d-img._centerY))); |
||
242 | var _30=Math.round(Math.max(0,this.canvas.width-_26)/2); |
||
243 | var _31=Math.round(Math.max(0,this.canvas.height-_27)/2); |
||
244 | var _32=_26;
|
||
245 | var _33=_28;
|
||
246 | if(this.zoom==1&&_21&&this.panX){ |
||
247 | if(this.panX<0){ |
||
248 | if(_21>0){ |
||
249 | _26-=Math.abs(this.panX);
|
||
250 | _30=0;
|
||
251 | }else{
|
||
252 | if(_21<0){ |
||
253 | _26=Math.max(1,Math.abs(this.panX)-5); |
||
254 | _30=this.size.w-_26;
|
||
255 | } |
||
256 | } |
||
257 | }else{
|
||
258 | if(_21>0){ |
||
259 | _26=Math.max(1,Math.abs(this.panX)-5); |
||
260 | _30=0;
|
||
261 | }else{
|
||
262 | if(_21<0){ |
||
263 | _26-=Math.abs(this.panX);
|
||
264 | _30=this.size.w-_26;
|
||
265 | } |
||
266 | } |
||
267 | } |
||
268 | _28=Math.max(1,Math.floor(_28*(_26/_32)));
|
||
269 | if(_21>0){ |
||
270 | _2e=(_2e+_33)-(_28); |
||
271 | } |
||
272 | _2e=Math.floor(_2e); |
||
273 | } |
||
274 | try{
|
||
275 | cxt.drawImage(img,Math.max(0,_2e),_2f,Math.min(_33,_28),_29,_30,_31,Math.min(_32,_26),_27);
|
||
276 | } |
||
277 | catch(e){
|
||
278 | } |
||
279 | },_setZoomAttr:function(_34){ |
||
280 | this.zoom=Math.min(this.maxZoom,Math.max(1,_34)); |
||
281 | if(this.zoom==1&&this._centerImg&&this._centerImg._loaded){ |
||
282 | if(!this.isAnimating()){ |
||
283 | this.zoomCenterX=this._centerImg.width/2; |
||
284 | this.zoomCenterY=this._centerImg.height/2; |
||
285 | } |
||
286 | this.panX=this.panY=0; |
||
287 | } |
||
288 | this.render();
|
||
289 | },_setZoomCenterXAttr:function(_35){ |
||
290 | if(_35!=this.zoomCenterX){ |
||
291 | if(this._centerImg&&this._centerImg._loaded){ |
||
292 | _35=Math.min(this._centerImg.width,_35);
|
||
293 | } |
||
294 | this.zoomCenterX=Math.max(0,Math.round(_35)); |
||
295 | } |
||
296 | },_setZoomCenterYAttr:function(_36){ |
||
297 | if(_36!=this.zoomCenterY){ |
||
298 | if(this._centerImg&&this._centerImg._loaded){ |
||
299 | _36=Math.min(this._centerImg.height,_36);
|
||
300 | } |
||
301 | this.zoomCenterY=Math.max(0,Math.round(_36)); |
||
302 | } |
||
303 | },_setZoomCenterAttr:function(_37){ |
||
304 | if(_37.x!=this.zoomCenterX||_37.y!=this.zoomCenterY){ |
||
305 | this.set("zoomCenterX",_37.x); |
||
306 | this.set("zoomCenterY",_37.y); |
||
307 | this.render();
|
||
308 | } |
||
309 | },_setAnimatedZoomAttr:function(_38){ |
||
310 | if(this._anim&&this._anim.status()=="playing"){ |
||
311 | return;
|
||
312 | } |
||
313 | this._anim=new dojo.Animation({curve:[this.zoom,_38],onAnimate:this._updateAnimatedZoom,onEnd:this._onAnimEnd}); |
||
314 | this._anim.play();
|
||
315 | },_updateAnimatedZoom:function(_39){ |
||
316 | this._setZoomAttr(_39);
|
||
317 | },_setCenterUrlAttr:function(_3a){ |
||
318 | this._setImage("center",_3a); |
||
319 | },_setLeftUrlAttr:function(_3b){ |
||
320 | this._setImage("left",_3b); |
||
321 | },_setRightUrlAttr:function(_3c){ |
||
322 | this._setImage("right",_3c); |
||
323 | },_setImage:function(_3d,_3e){ |
||
324 | var _3f=null; |
||
325 | var _40=null; |
||
326 | if(dojo.isString(_3e)){
|
||
327 | _40=_3e; |
||
328 | }else{
|
||
329 | _40=_3e.large; |
||
330 | _3f=_3e.small; |
||
331 | } |
||
332 | if(this["_"+_3d+"Img"]&&this["_"+_3d+"Img"]._src==_40){ |
||
333 | return;
|
||
334 | } |
||
335 | var _41=this["_"+_3d+"Img"]=new Image(); |
||
336 | _41._type=_3d; |
||
337 | _41._loaded=false;
|
||
338 | _41._src=_40; |
||
339 | _41._conn=dojo.connect(_41,"onload",this.handleLoad); |
||
340 | if(_3f){
|
||
341 | var _42=this["_"+_3d+"SmallImg"]=new Image(); |
||
342 | _42._type=_3d; |
||
343 | _42._loaded=false;
|
||
344 | _42._conn=dojo.connect(_42,"onload",this.handleLoad); |
||
345 | _42._isSmall=true;
|
||
346 | _42._src=_3f; |
||
347 | _42.src=_3f; |
||
348 | } |
||
349 | _41.src=_40; |
||
350 | },handleLoad:function(evt){ |
||
351 | var img=evt.target;
|
||
352 | img._loaded=true;
|
||
353 | dojo.disconnect(img._conn); |
||
354 | var _43=img._type;
|
||
355 | switch(_43){
|
||
356 | case "center": |
||
357 | this.zoomCenterX=img.width/2; |
||
358 | this.zoomCenterY=img.height/2; |
||
359 | break;
|
||
360 | } |
||
361 | var _44=img.height;
|
||
362 | var _45=img.width;
|
||
363 | if(_45/this.size.w<_44/this.size.h){ |
||
364 | img._baseHeight=this.canvas.height;
|
||
365 | img._baseWidth=_45/(_44/this.size.h);
|
||
366 | }else{
|
||
367 | img._baseWidth=this.canvas.width;
|
||
368 | img._baseHeight=_44/(_45/this.size.w);
|
||
369 | } |
||
370 | img._centerX=_45/2;
|
||
371 | img._centerY=_44/2;
|
||
372 | this.render();
|
||
373 | this.onLoad(img._type,img._src,img._isSmall);
|
||
374 | },onLoad:function(_46,url,_47){ |
||
375 | }}); |
||
376 | } |