Muchas veces nos es necesario hacer un efecto de zoom a ciertos clips o imágenes, por ejemplo cuando tenemos mapas, entornos que muestran opciones más pequeñas conforme se van acercando a ella, etc. Realizar este efecto es muy útil y ayuda a la usabilidad de nuestra aplicación.
En este caso en específico explicaré sólo el método de acercamiento por medio del click del mouse a un lugar en específico del clip.
Lo que necesitaremos será el clip a trabajar, dentro del cual podremos poner lo que queramos, imágenes, dibujos, etc. Luego le asignamos un nombre de instancia (en este caso mapa) y sólo resta copiar este código en el primer frame de la película principal.
Código :
incremento = 2;
function zoom(x,y,ancho,alto, aceleracion) {
mapa.onEnterFrame = function() {
this._x += (x-this._x)/aceleracion;
this._y += (y-this._y)/aceleracion;
this._width += (ancho-this._width)/aceleracion;
this._height+= (alto-this._height)/aceleracion;
if (Math.abs(x-this._x)<0.5 && Math.abs(y-this._y)<0.5 && Math.abs(ancho-this._width)<0.5 && Math.abs(alto-this._height)<0.5) {
this._x = x;
this._y = y;
this._width = ancho;
this._height = alto;
delete this.onEnterFrame;
}
};
};
onMouseDown =function(){
if (mapa.hitTest(_xmouse,_ymouse)){
Alto = incremento*mapa._height;
Ancho = incremento*mapa._width;
x = _xmouse-((_xmouse-mapa._x) * incremento);
y= _ymouse-((_ymouse-mapa._y) * incremento);
zoom(x,y,Ancho,Alto,3);
}
};¡Y listo! Ya puede usarse, sólo prueba dando click encima del clip.
Ahora procederé a explicar el código.
Incremento es la variable que determina el tamaño del acercamiento, en este caso lo incrementa en un 200% puede ser modificable a nuestro antojo.
Esta porción de código es parte de este tip con la diferencia que incrementa dos variables más, ancho y alto, las cuales se encargarán de modificar el ancho y el alto del clip, haciendo la misma función que las variables de columna y fila y la misma comprobación, si se ha cumplido, para poder eliminar el enterframe.
Código :
function zoom(x,y,ancho,alto, aceleracion) {
mapa.onEnterFrame = function() {
this._x += (x-this._x)/aceleracion;
this._y += (y-this._y)/aceleracion;
this._width += (ancho-this._width)/aceleracion;
this._height+= (alto-this._height)/aceleracion;
if (Math.abs(x-this._x)<0.5 && Math.abs(y-this._y)<0.5 && Math.abs(ancho-this._width)<0.5 && Math.abs(alto-this._height)<0.5) {
this._x = x;
this._y = y;
this._width = ancho;
this._height = alto;
delete this.onEnterFrame;
}
};
};La siguiente parte es la importante, lo primero que hará será detectar si el mouse ha sido presionado.
Código :
onMouseDown =function(){Esto hará la comprobación por medio de la cual verificará si las coordenadas del mouse en el momento que se presionó están sobre el clip, lo cual indicará que se ha echo click sobre él.
Código :
if (mapa.hitTest(_xmouse,_ymouse)){Después de eso se calculará el tamaño de la película con el zoom:
Código :
Alto = incremento*mapa._height; Ancho = incremento*mapa._width;
que es donde interviene la variable incremento, la cual, reitero, podremos manejar a nuestro antojo.
Luego haremos el cálculo de la nueva posición del clip, ya que si lo dejamos en esa posición, se nos moverá hacia la derecha y hacia abajo, lo cual nos desubica, para lo cual se emplea la siguiente ecuación:
Código :
x = _xmouse-((_xmouse-mapa._x) * incremento); y= _ymouse-((_ymouse-mapa._y) * incremento);
Y por último le mandamos a la función los parámetros y ella se encargará del resto.
Código :
zoom(x,y,Ancho,Alto,3);
Nota: es importante que al crear el clip, el punto de registro sea a la izquierda arriba.
Espero les sirva.

Por pollita el 05 de Junio de 2007
Por ferranpujol el 05 de Junio de 2007
Por jdgomezb el 05 de Junio de 2007
Por joshuavw el 07 de Junio de 2007
Por eCCe el 11 de Junio de 2007
Por el 11 de Junio de 2007
Por The Big Boss el 11 de Junio de 2007
Por The Big Boss el 11 de Junio de 2007
Por bibiana el 12 de Junio de 2007
Por Señor Oz el 13 de Junio de 2007
if zoomActivado = true;
//aqui ponen el codigo original de FeNtO para aumentar, que es algo como esto.
if (mapa.hitTest(_xmouse,_ymouse)){
Alto = incremento*mapa._height;
Ancho = incremento*mapa._width;x = _xmouse-((_xmouse-mapa._x) * incremento);
y= _ymouse-((_ymouse-mapa._y) * incremento);zoom(x,y,Ancho,Alto,3);
despues ponen un else, decir, que si la variable zoomActivado, o como sea que le hayan puesto para determinar el valor booleano, es igual a "false, ponen lo mismo, pero en lugar de aumentar, reducir, es decir el alto seria igual al ancho o alto del clip entre el incremento, es decir, lo contrario, es todo.
La otra opcion seria si quieren que el zoom nada mas se pueda permitir una vez, y que dando un segundo clip, automaticamente se aleje, lo unico que tienen que agregar al codigo original de FeNtO es una variable con valor booleano, y cada que se haga click, es decir, en la funcion onMouseDown, cambiar el valor de true a false o viceversa, y agregarle que se hace en cada caso, es decir, multiplicar ancho, alto, "x" y "y" por el incremento, o en caso contrario, para alejarlo dividirlo entre dos, checare a ver si funciona y despues se los confirmo, es solo una idea, obvio, lo demas les toca a ustedes, jejeje
Por Señor Oz el 13 de Junio de 2007
Por korner el 19 de Julio de 2007
Por AlexxanderDeLarge el 23 de Julio de 2007
Por Pedro el 02 de Diciembre de 2007
si lo haces tienes un puesto en el cielo de segurito man.
por que vi lo que pusistes arriba pero no me sale bien asi que si lo haces con un ejemplo seria mas facilde entender gracias.
Por M el 18 de Abril de 2008
Por Joparoto el 12 de Mayo de 2008
Por jose flashpageflip el 19 de Junio de 2008
Por Markius el 31 de Octubre de 2008
Estoy trabajando en un proyecto que requiere realizar un mapa al que se le debe poder hacer zoom (para alejar y acercar) además de poder hacerle un drag sobre el mismo.
Logre hacer uno sacando distintas cosas de varios tutoriales (que anda bastante bien) pero con una pequeña (gran) falla: cuando lo agrando (o achico) lo hace desde la esquina superior izq hacia afuera, es por eso que me interesó este tutorial, pero el tema es que no puedo adaptar esto a lo hecho por mi (en realidad ni siquiera puedo hacer que tu trabajo pueda hacerlo andar desde un boton sin presionar directamente sobre la imagen). En fin, te agradecería mucho me puedas dar una mano con esto.
Saludos
Por Phixin el 27 de Enero de 2009
oye, es que soy muy bruto para esto del action
me funciona el código rebien, pero o que quiero es que hallan dos botones (zoom in, zoom out) por que hice un pageflip con solo mc que son cada pag.
el caso es que no entiendo el boolean aplicado a este ejemplo...
lo podrías explicar con el código aplicado a los botones?
o que se cargue una imagen externa grande y se pueda cerrar ese load para seguir viendo el "libro"
Por Sandra el 18 de Mayo de 2009
Por paisa el 09 de Junio de 2009
quiero que se le pueda hacer zoom a cualquier parte de las paginas
mil gracias
Por JavierM el 17 de Junio de 2009
on (keyPress "<Down>") {
if (mapa.hitTest(_xmouse,_ymouse)){
Alto = mapa._height / incremento;
Ancho = mapa._width / incremento;
x = _xmouse-((_xmouse-mapa._x) / incremento);
y = _ymouse-((_ymouse-mapa._y) / incremento); zoom(x,y,Ancho,Alto,3);
}
}
El problema es que, en otra parte tengo esto en un setInterval
if (Key.isDown(65)) {
_root.mapa._x+=10;
}
if (Key.isDown(6
_root.mapa._x-=10;
}
if (Key.isDown(87)) {
if (_root.mapa._y<-11) {
_root.mapa._y+=10;
}
}
if (Key.isDown(83)) {
if ((_root.mapa._y+mapa._height)>501) {
_root.mapa._y-=10;
}
}
al principio funciona bien, pero luego de acercar y alejar deja de funcionar y no mueve el Movieclip mapa hacia donde le indico.
Espero respuesta.
Por inuyasha_sama el 29 de Octubre de 2009
incremento = 4;
zoomActivado = false;
ini_x=mapa._x;
ini_y=mapa._y;
function zoom(x,y,ancho,alto, aceleracion)
{
mapa.onEnterFrame = function()
{
this._x += (x-this._x)/aceleracion;
this._y += (y-this._y)/aceleracion;
this._width += (ancho-this._width)/aceleracion;
this._height+= (alto-this._height)/aceleracion;
if (Math.abs(x-this._x)<0.5 && Math.abs(y-this._y)<0.5 && Math.abs(ancho-this._width)<0.5 && Math.abs(alto-this._height)<0.5)
{
this._x = x;
this._y = y;
this._width = ancho;
this._height = alto;
delete this.onEnterFrame;
}
};
};
onMouseDown =function()
{
//Esto hará la comprobación por medio de la cual verificará si las coordenadas del mouse en el momento que se presionó están sobre el clip, lo cual indicará que se ha echo click sobre él.
if (mapa.hitTest(_xmouse,_ymouse))
{
if(zoomActivado == false)
{
//Después de eso se calculará el tamaño de la película con el zoom
Alto = incremento*mapa._height;
Ancho = incremento*mapa._width;
//Luego haremos el cálculo de la nueva posición del clip, ya que si lo dejamos en esa posición, se nos moverá hacia la derecha y hacia abajo, lo cual nos desubica, para lo cual se emplea la siguiente ecuación
xs = _xmouse-((_xmouse-mapa._x) * incremento);
ys = _ymouse-((_ymouse-mapa._y) * incremento);
//Desactivamos el Flag para el zoomOut
zoomActivado=true;
}
else
{
Alto = mapa._height/incremento;
Ancho = mapa._width/incremento;
//Luego haremos el cálculo de la nueva posición del clip, ya que si lo dejamos en esa posición, se nos moverá hacia la derecha y hacia abajo, lo cual nos desubica, para lo cual se emplea la siguiente ecuación
xs = ini_x//_xmouse-((_xmouse-mapa._x) / incremento);
ys = ini_y//_ymouse-((_ymouse-mapa._y) / incremento);
//Desactivamos el Flag para el zoomOut
zoomActivado=false;
}
//Mandamos los parametros y el onentreframe reubicara y reescalara con easing..
zoom(xs,ys,Ancho,Alto,3);
}
}
Aporto mi granito... espero les sirva..
Por mauro2007 el 09 de Marzo de 2010
Por Laura el 12 de Marzo de 2010
justo lo que había andado buscando desde hace tiempo
gracias!!!!!!!!
Por MX200 el 17 de Marzo de 2010
Por lemon el 15 de Abril de 2010
Por duck el 22 de Agosto de 2010
Por leper el 28 de Agosto de 2010
ek movie clip al que le hago zoom esta por debajo de estos botones por lo que si apreto estos otros botones tambien me hace zoom como puedo hacer para excluirlos
Por Mariano el 03 de Noviembre de 2010
Alto = (1/incremento) * mapa._height;
Ancho = (1/incremento) * mapa._width;
xs = _xmouse-((_xmouse-mapa._x) * (1/incremento));
ys = _ymouse-((_ymouse-mapa._y) * (1/incremento));
zoom(xs,ys,Ancho,Alto,1.5);
Espero no lo hayan publicado mas arriba, no leí todo los comentarios
Por oscarsson el 09 de Febrero de 2011
Por Patrick, el 15 de Marzo de 2011
Por el 01 de Octubre de 2011
Por utzang el 04 de Octubre de 2011
¿podría alguien adecuar este codigo para su uso con dos botones, uno que aumente y otro que disminuya?
Gracias de antemano