11 07 08

Efecto lupa con zoom en ActionScript 3

Escrito por: WeeDo en Flash, Tutoriales, AS3

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.

Necesita el 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.

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

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

Actionscript:
  1. import weedo.fx.Lupa;
  2.  
  3. var sh:Shape = new Shape();
  4. sh.graphics.beginFill(0x000000,1);
  5. sh.graphics.drawCircle(0, 0, 50);
  6. sh.graphics.endFill();
  7.  
  8. var lp:Lupa = new Lupa("small.jpg", "big.jpg", sh);
  9. lp.x = stage.stageWidth * .5;
  10. lp.y = stage.stageHeight * .5;
  11. 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í:

Actionscript:
  1. var sh:Shape = new Shape();
  2. sh.graphics.beginFill(0x000000,1);
  3. sh.graphics.drawRect(-25, -25, 50, 50);
  4. 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

1 comentario sobre “Efecto lupa con zoom en ActionScript 3”

  • 1

    tincc dijo:

    Un lujo hermano salu2

Deje un comentario