Post Escrito

compartir

Efecto lupa con zoom en ActionScript 3 View Comments

Jul11

Este es un efecto muy utilizado en varios tipos de desarrollo. Como puede ser en un catálogo de productos, ejemplo clásico si los hay.
Se me ocurrió armar una clase en AS3 para esta utilidad, a modo de simplificar el trabajo.
De paso les dejo una hermosa imagen del calendario Maya. Gran civilización si las hubo!

Mové el mouse sobre la imagen para ver el efecto.

This movie requires Flash Player 9

A continuación les dejo la clase completa. Vale destacar los cuatro métodos con namespace en “protected”.
Estos métodos pueden ser reescritos si la clase es extendida… De manera tal que se puedan manejar los eventos de progreso de carga, y de la carga completa. Para poder sumarle un preloader tanto a la imagen chica, como a la grande por ejemplo.

?Ver código ACTIONSCRIPT
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
package weedo.fx {
 
import flash.display.DisplayObject;
import flash.display.Sprite;
import flash.display.Loader;
import flash.events.*;
import flash.net.URLRequest;
import flash.ui.Mouse;
 
public class Lupa extends Sprite
{
     private var imgURL:String;
     private var imgBigURL:String;
     private var mascara:DisplayObject;
     private var small:Sprite;
     private var big:Sprite;
     private var cargaCompleta:Boolean;
 
     public function Lupa(_imgURL:String, _imgBigURL:String, _mask:DisplayObject):void
     {
          imgURL = _imgURL;
          imgBigURL = _imgBigURL;
          mascara = _mask;
 
          this.mouseChildren = false;
          this.addEventListener(MouseEvent.MOUSE_MOVE, onMove);
          this.addEventListener(MouseEvent.ROLL_OUT, onOut);
          this.addEventListener(MouseEvent.ROLL_OVER, onOver);
 
          cargarImg();
     }
 
     private function cargarImg():void
     {
          var loaderImg:Loader = new Loader();
          loaderImg.contentLoaderInfo.addEventListener(Event.COMPLETE, onCompleteImg);
          loaderImg.contentLoaderInfo.addEventListener(Event.INIT, onInitImg);
          loaderImg.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgressImg);
          loaderImg.load(new URLRequest(imgURL));
     }
 
     private function cargarImgBig():void
     {
          var loaderImgBig:Loader = new Loader();
         loaderImgBig.contentLoaderInfo.addEventListener(Event.COMPLETE, onCompleteImgBig);
          loaderImgBig.contentLoaderInfo.addEventListener(Event.INIT, onInitImgBig);
          loaderImgBig.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgressImgBig);
          loaderImgBig.load(new URLRequest(imgBigURL));
     }
 
     protected function onProgressImg(e:ProgressEvent):void
     {
          trace("img: "+Math.round((e.bytesLoaded*100)/e.bytesTotal));
     }
     protected function onProgressImgBig(e:ProgressEvent):void
     {
          trace("imgBig: "+Math.round((e.bytesLoaded*100)/e.bytesTotal));
     }
     protected function onInitImg(e:Event):void
     {
          trace("termino img");
     }
     protected function onInitImgBig(e:Event):void
     {
          trace("termino imgBig");
     }
 
     private function onCompleteImg(e:Event):void
     {
          small = new Sprite();
          e.target.content.x = -(e.target.content.width*.5);
          e.target.content.y = -(e.target.content.height*.5);
          small.addChild(e.target.content);
 
          addChild(small);
          cargarImgBig();
     }
 
     private function onCompleteImgBig(e:Event):void
     {
          big = new Sprite();
          e.target.content.x = -(e.target.content.width*.5);
          e.target.content.y = -(e.target.content.height*.5);
          big.addChild(e.target.content);
          big.mask = mascara;
          big.visible = false;
 
          addChild(big);
          addChild(mascara);
          cargaCompleta = true;
     }
 
     private function onMove(e:MouseEvent):void
     {
          if(cargaCompleta){
               mascara.x = mouseX;
               mascara.y = mouseY;
 
               big.x = -((big.width * small.mouseX)/small.width) + small.mouseX;
               big.y = -((big.height * small.mouseY)/small.height) + small.mouseY;
          }
     }
 
     private function onOut(e:MouseEvent):void
     {
          if(cargaCompleta){
               big.visible = false;
               Mouse.show();
          }
     }
 
     private function onOver(e:MouseEvent):void
     {
          if(cargaCompleta){
               big.visible = true;
               Mouse.hide();
          }
     }
 
     public function cambiarMascara(_tg:DisplayObject):void
     {
          if(cargaCompleta){
               mascara = _tg;
               big.mask = mascara;
          }
     }
 
 }
}

Para implementar la clase en el IDE de Flash deberían escribir algo así:

?Ver código ACTIONSCRIPT
1
2
3
4
5
6
7
8
9
10
11
import weedo.fx.Lupa;
 
var sh:Shape = new Shape();
sh.graphics.beginFill(0x000000,1);
sh.graphics.drawCircle(0, 0, 50);
sh.graphics.endFill();
 
var lp:Lupa = new Lupa("small.jpg", "big.jpg", sh);
lp.x = stage.stageWidth * .5;
lp.y = stage.stageHeight * .5;
addChild(lp);

En este ejemplo importamos la clase en la primer linea. Luego creamos un Shape circular y por último creamos nuestra lupa con sus 3 parametros.
Primero la imagen pequeña, luego la grande y por último la máscara que usaremos como lupa.
En este caso la máscara es un Shape circular. También podría ser un rectangulo y hasta un movieclip con la forma que querramos.
Ojo que el punto de registro siempre tiene que estar en el medio de nuestra máscara.

Por ejemplo si queremos usar un rectangulo, el código debería ser así:

?Ver código ACTIONSCRIPT
1
2
3
4
var sh:Shape = new Shape();
sh.graphics.beginFill(0x000000,1);
sh.graphics.drawRect(-25, -25, 50, 50);
sh.graphics.endFill();

Fijense como uso el “-25″ para correr el punto de registro.

Bueno espero les sirva, acá les dejo también los archivos del ejemplo:

Archivos del ejemplo

También te puede interesar:

  • Josué Blanco
    Gracias, muy bueno, este en especifico no esta muy explicado pero gracias por todos tus tutoriales que me han salvado la vida ya varias veces. Saludos des de Guatemala.
  • john
    Hola, que buena web tienes he visto muchas con tutoriales pero esta es la mejo. gracias y espero sigas suviendo tutoriales como estos.
    Ha¡ y de ActionScript 3 para principiantes
  • HOLA ....
    SOY NUEVO EN ESTO
    TENGO 12 AÑOS
    ME PARECE MUY COOL ESTO LA VERDD GRACIAS POR LA AYUDA
  • maxi
    seba.. si tengo alguna duda te pregunto... :P

    muy buena tu pagina y los tuto... ya me vi casi todos...

    saludos nos vemos en los raimonds

    maxi..
  • tincc
    Un lujo hermano salu2
blog comments powered by Disqus

DeCabeza.net usa WordPress y el tema FREEmium.
desarrollado por Dariusz Siedlecki y modificado por DeCabeza.net