Cristalab

Panel de zoom de imágenes en ActionScript 3

Por: Zguillez + 27.09.2007

Este tip es un ejemplo del estilo de "Zoom con lupa", aunque en esta ocasión es un zoom sobre una imagen con un panel de visualización al estilo de Photoshop.

El ejemplo es el siguiente:


Arrastra la zona roja del panel para desplazar la imagen


Para realizar este ejemplo necesitaremos la imagen a dos tamaños, una grande que colocaremos dentro de una máscara, y otra pequeña que colocaremos dentro de un MovieClip que utilizaremos como visor.



La imagen grande la colocaremos dentro de un clip al que llamaremos "mapaBig", y su mascara será otro clip al que llamaremos "mascara".

En cuanto al clip de visor lo llamaremos "visor" y la imagen pequeña "mapaSmall". Este clip contendrá tambien un botón que situaremos en la parte superior del panel que nos servirá para agarrar y mover el panel, este botón se llamará "botDrag". Tambien tendremos otro movieclip llamado "zona" formado por un rectángulo de color rojo y un botón invisible con el nombre "botZona".

Unas vez con la estructura de clips montada iremos a por el código. Todo este irá en el primer fotograma.

Empezaremos creandonos unas funciones para realizar el arrastre de la zona de zoom. Haremos que estas funciones nos sirvan tanto para el drag de la zona como para el drag del panel.

Código :

var visor_fx:Boolean = false;
//-----------------------------------------------
visor.botDrag.addEventListener(MouseEvent.MOUSE_DOWN, onStartDrag);
visor.botDrag.addEventListener(MouseEvent.MOUSE_UP, onStopDrag);
visor.botDrag.addEventListener(MouseEvent.MOUSE_OUT, onStopDrag);
visor.zona.botZona.addEventListener(MouseEvent.MOUSE_DOWN, onStartDrag);
visor.zona.botZona.addEventListener(MouseEvent.MOUSE_UP, onStopDrag);
visor.zona.botZona.addEventListener(MouseEvent.MOUSE_OUT, onStopDrag);
//-----------------------------------------------
function onStartDrag(e:Event):void
{
   var clip:MovieClip = e.target.parent;
   clip.startDrag();
   visor_fx = true;
}
function onStopDrag(e:Event):void
{
   e.target.parent.stopDrag();
   visor_fx = false;
}

Las funciones recuperan como parametro (target.parent) el clip que han de arrastrar dependiendo del clip que lanzó el evento.

También creamos una variable "visor_fx" que nos indica si estamos arrastrando algo en ese momento. Esto lo hacemos para posteriormente crear una función que se ejecute cada vez que movamos el mouse pero que solo ejecute las funciones internas en el caso de estar arrastrando el clip de "zona".

Código :

this.addEventListener(MouseEvent.MOUSE_MOVE, MouseMove);
//-----------------------------------------------
function MouseMove(e:Event):void
{
   if (visor_fx == true) {
      calculaDist();
      mueveVisorZona();
      controlaPosiciones();
   }
}


Aparte del arrastre haremos que al clicar sobre la imagen pequeña la zona se sitúe directamente en esa posición.

Código :

visor.mapaSmall.addEventListener(MouseEvent.MOUSE_DOWN, onPosicionaZona);
//-----------------------------------------------
function onPosicionaZona(e:Event):void
{
   var clip:MovieClip = e.target.parent;
   clip.zona.x = mouseX-clip.x- clip.zona.width/2
   clip.zona.y = mouseY-clip.y- clip.zona.height/2
   calculaDist();
   mueveVisorZona();
   controlaPosiciones();
}


Ahora vamos con las funciones que realizaran el desplazamiento de la imagen grande en función de la posición del clip "zona" sobre la imagen pequeña. Empezaremos creando unas variables:

Código :

var porcentajeX:Number = 100 / (mapaBig.width / visor.mapaSmall.width);
var porcentajeY:Number = 100 / (mapaBig.height / visor.mapaSmall.height);
visor.zona.width = mascara.width * porcentajeX / 100;
visor.zona.height = mascara.height * porcentajeY / 100;
var distX:Number = 0;
var distY:Number = 0;


La variable porcentajeX/Y calcula el porcentaje de escalado entre las dos imágenes. Una vez sabemos este porcentaje escalamos el clip "zona" a la misma escala en relación a la imagen pequeña.

También creamos dos variables distX/Y que contendrán la distancia de corrección de la imagen grande en relación al visor, las dejaremos a 0 ya que haremos una función para calcular esa distancia.

Código :

function calculaDist():void
{
   distX = (visor.zona.x - visor.mapaSmall.x) / porcentajeX * 100;
   distY = (visor.zona.y - visor.mapaSmall.y) / porcentajeY * 100;

   distX = (distX<0)?0:distX;
   distY = (distY<0)?0:distY;
}


En función de estos valores moveremos la imagen grande bajo la máscara.

Código :

function mueveVisorZona():void
{
   mapaBig.x = mascara.x - distX;
   mapaBig.y = mascara.y - distY;
}


Solo queda crear una función que controle que al arrastrar no desplacemos el clip de zona fuera del visor, o el visor fuera de la película.

Código :

function controlaPosiciones():void
{
   //visor
   if (visor.x<0) {
      visor.x=0;
   } else if (visor.x>stage.stageWidth-visor.width) {
      visor.x=stage.stageWidth-visor.width;
   }
   if (visor.y<0) {
      visor.y=0;
   } else if (visor.y>stage.stageHeight-visor.height) {
      visor.y=stage.stageHeight-visor.height;
   }
   //zona
   if (visor.zona.x<visor.mapaSmall.x) {
      visor.zona.x=visor.mapaSmall.x;
   } else if (visor.zona.x>visor.mapaSmall.x+visor.mapaSmall.width-visor.zona.width) {
      visor.zona.x=visor.mapaSmall.x+visor.mapaSmall.width-visor.zona.width;
   }
   if (visor.zona.y<visor.mapaSmall.y) {
      visor.zona.y=visor.mapaSmall.y;
   } else if (visor.zona.y>visor.mapaSmall.y+visor.mapaSmall.height-visor.zona.height) {
      visor.zona.y=visor.mapaSmall.y+visor.mapaSmall.height-visor.zona.height;
   }
   //mapaBig
   if (mapaBig.x>0) {
      mapaBig.x=0;
   } else if (mapaBig.x<mascara.width-mapaBig.width) {
      mapaBig.x=mascara.width-mapaBig.width;
   }
   if (mapaBig.y>0) {
      mapaBig.y=0;
   } else if (mapaBig.y<mascara.height-mapaBig.height) {
      mapaBig.y=mascara.height-mapaBig.height;
   }
}


Y listo, ejemplo acabado miau

Aqui el archivo .fla

Etiquetas actionscript_3 flash

Comentarios | Enviar un comentario
Muy bueno. Muy Feliz
Por: Carloz.Yanez
Añadí este código al final de la función onPosicionaZona

Código :


   if (visor_fx != true){
         var clip2:MovieClip = e.target.parent.zona;
         clip2.startDrag();
         visor_fx = true;
   }


Clic y mover el mouse por el minimapa sin hacer drag en el visor rojo.


No logré arreglar el pequeño fallo de que se detiene el drag al sacarlo fuera y que no lo recupera.
Pero no quiero pensar mas por hoy ya. Riendo
Por: Bleend
Hola pues tengo muchisimas dudas sobre como crear un flash...
y no estoy segura de si eso es lo basico...
por que hay algunas cosas que no puedo entender , como que cosa es un clip...
Por: Rosa_blog
excelente COMO siempre Zg

rosa para aprender un poco mas entra a http://www.cristalab.com/flash/ miau
Por: eldervaz
Que bueno!!!

Rosa, aqui en cristalab encontraras un manual completo de flash, desde cero.

Saludos!

Cada dia aprendiendo mas
Por: pabletein_blog
Excelente !!! Gracias por esos aportes.
Por: Sebastian_blog
Excelente como siempre Zguillez, esta genial el tip, pero... no logro ubicar las islas Clab por hay mmmm... ah deser que me falta buscar mejor verdad? mmmm, de lo contrario me temo que ese mapa no es una fidedigna carta de navegacion... Riendo
Por: EmiR
Debemos preparar una invación a MySpaces, es demasiado grande.
Por: GersonM_blog

EmiR :

no logro ubicar las islas Clab[...] me temo que ese mapa no es una fidedigna carta de navegacion... Riendo


estas en lo cierto.

y excelente lo tuyo Zguillez, un maestro
Por: penHolder
buen tip! miau
eeehhhmmm..... ya había visto esto en flex, pero no recuerdo el sitio...
Por: master_of_puppetz
Thumbs up
Por: electrocontaminación_blog
Bien, pero muy bien..!
Por: torrealbaruben
Hola a todos:

No sé exactamente el por qué, pero al intentar abrir el archivo fla, me dice que no reconoce el formato. Trabajo con Flash 8. ¿Alguna sugerencia?
Por: fpalacios_blog
muy bueno, sigue adelante
Por: andysnayder_blog

fpalacios_blog :

Hola a todos:

No sé exactamente el por qué, pero al intentar abrir el archivo fla, me dice que no reconoce el formato. Trabajo con Flash 8. ¿Alguna sugerencia?

¿Sugerencias? Si... instalar Flash CS3.
El fla no es Flas 8.
Por: Nito

Marqués NitOverCaterbury :

¿Sugerencias? Si... instalar Flash CS3.
El fla no es Flas 8.

Perdón quiese escribir Flash8 Lengua
Por: Nito
A pero antes que te compres el CS3 tienes que tener como mínimo 1gb de ram Riendo(para la instalación).







PD: No te vaya a pasar como a mí Riendo, esa vez me quede con las ganas d instalarlo Llorando .
Por: electrocontaminación_blog
me puedes pasar esto mismo ...para flas8
gracias
pedro
Por: pedro_blog
Hola necesito saber como puedo hacer para que cuando yo doy clic a una imagen esta se hago grande
Por: adriana_blog
Hola, perdón, quería revisar más a fondo el archivo para ver como funciona, pero no puedo abrir el archivo fla una vez que lo descargo. Ya intenté en diferentes versiones de flash y diferentes máquinas y no me permite aún así abrirlo.

¿Estará mal el archivo que colocaron para descargar?

Saludos

Gracias
Por: Danny C._blog
Hola! muy bueno el tip.... Ya quiero aprender AS3, pero por el momento aun no termino de comprender el AS2......
Alquien me puede como modificar este ejemplo para utilizarlo en Flash 8?
Gracias!
Saludos.
Por: crokis
Deja un comentario
IMPORTANTE

Recuerda ser respetuoso, no insultes a otras personas, ni uses palabrotas, hay una persona al otro lado de la pantalla.

Habla bien, NO ESCRIBAS EN MAYUSCULA TODO, no escribas como en un SMS, evita cosas como "ke", "x q" y demás abreviaciones.

Aquí funcionan las etiquetas de los foros, puedes usar [b] para negrita, [img] para las imágenes, [url] para los enlaces, etc.

Si tienes preguntas técnicas, envíalas mejor al foro.