Comunidad de diseño web y desarrollo en internet online

eventos sobre sprites anidados

Citar            
MensajeEscrito el 09 Mar 2011 04:50 pm
Hola de nuevo,

Una consulta, tengo un Sprite que en su interior contiene dos sprites anidados entre otras cosas, pero resumiendo:
i.e.

Código ActionScript :

var globalHolder:Sprite=new Sprite(); 
var nestedHolder01:Sprite=new Sprite(); 
var nestedHolder02:Sprite=new Sprite(); 

globalHolder.addChild(nestedHolder01); 
globalHolder.addChild(nestedHolder02); 

addChild(globalHolder);


El caso es que asocio un listener al sprite global (evento de mover la rueda del mouse sobre él) esperando que afecte a todo su contenido pero no es así.

Código ActionScript :

globalHolder.addEventListener(MouseEvent.MOUSE_WHEEL, onMouseWheelHandler);

private function onMouseWheelHandler(mouseEvent:MouseEvent):void {
         
   if(mouseEvent.delta > 0) zoomIn();
    else zoomOut();
         
}//end 'function'

Si muevo la rueda del mouse sobre cualquiera de los elementos contenidos en los sprites anidados, no detecta el evento. ¿Que puedo hacer para que afecte a todo su contenido?
He probado de asociar listeners al contenido pero tampoco funciona.

Ayuda por favor :)

Por emedmaria

73 de clabLevel



 

chrome
Citar            
MensajeEscrito el 09 Mar 2011 04:52 pm
Aps! Mover la rueda del mouse en una zona del contenedor global que no contiene elementos de los sprites anidado sí funciona!

Por emedmaria

73 de clabLevel



 

chrome
Citar            
MensajeEscrito el 09 Mar 2011 05:38 pm
Es por las fases en el ciclo de vida de los eventos (uh! que complejo se oye en Español!).

Tienes que deshabilitar los objetos dentro de globalHolder,

Código ActionScript :

globalHolder.mouseChildren = false;


Y listo el pollo :)

Por Acreonte

Claber

1543 de clabLevel

5 tutoriales
6 articulos

Genero:Masculino  

Digital Scientist

firefox
Citar            
MensajeEscrito el 09 Mar 2011 05:51 pm
GRACIAS!

Efectivamente me faltaba eso :) Otra pregunta, ¿esto es compatible con asignar otros eventos propios sobre 'objetos/clips' contenidos en los contenedores/sprites anidados?

Porque en un futuro necesitaré eventos como el citado sobre el globalHolder y otros concretos sobre elementos contenidos en nestedHolder01. No sé si al desabilitar los objetos contenidos en globaHolder desabilitamos detección de eventos (i.e. Mouse.CLICK) en su contenido.

Gracias de nuevo!

Por emedmaria

73 de clabLevel



 

chrome
Citar            
MensajeEscrito el 09 Mar 2011 08:22 pm
globalHolder.mouseChildren = false; lo que hace es deshabilitar cualquier inteaccion del mouse con los movies hijos.

Para hacer que los eventos de los hijos no interfieran con los del padre (o alrevez) tienes que agregar un codigo a la funcion del click de los hijos:

this.addEventListener(MouseEvent.CLICK, clickHandler);

function clickHandler(e:MouseEvent){
e.stopPropagation();
trace("soy el hijo")
}

e.stopPropagation(); detiene la propagacion del evento del click a los otros elementos anidados en el movie.

Revisa la documentacion para saber mas :
http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/

Por Lunaty

Claber

118 de clabLevel



Genero:Femenino  

Flash Developer & RM Email Support for Google

chrome
Citar            
MensajeEscrito el 10 Mar 2011 09:05 am
Gracias de nuevo!
Le voy dar un vistazo a la documentación. Pero a ver si lo he entendido bien...Si tenemos eventos sobre el contenedor global y sobre los componentes de los sprites anidados el e.stopPropagation() debería ponerlo tanto en las funciones de escucha/detectoras de eventos del padre y de los elementos contenidos en el hijo, no?

Si el contenido de hijos son objetos de una clase cuyos eventos se lanzan en dicha clase ¿deberé ponerlo allí? Y si los eventos del padre se lanzan desde otra clase,¿ lo ubicaré en la clase desde donde se lanzan?

Es un poco enrevesado, espero haberme hecho entender :)

Gracias miL!

Por emedmaria

73 de clabLevel



 

chrome
Citar            
MensajeEscrito el 10 Mar 2011 05:40 pm
Bueno para entender como funciona stopPropagation() tienes que comprender un poco como funcionan los eventos:

Cuando un evento es disparado (por ejemplo un click a un movie), este evento es recibido por la funcion escuchadora. Ahora bien que pasa si por ejemplo, como en tu caso, tienes un sprite escuchando al click y a la vez este sprite tiene hijos que tambien estan escuchando al mismo tipo de evento:

Si hago click sobre un hijo, la funcion escuchadora de este recibira el evento, pero ademas este evento sera propagado al padre, por lo que la funcion escuchadora del padre tambien recibira el evento y ejecutara lo que hayas definido ahi. Si tuvieras otro sprite conteniendo al padre y este tambien estuviera escuchando al click, este tambien recibiria el evento.

Ahora, la funcion stopPropagation() lo que hace es detener la propagacion de este evento, por ejemplo, si llamo stopPropagation() en la funcion escuchadora del hijo, ahi detendra el evento, y asi evito que el padre reciba este evento y ejecute su funcion escuchadora.
comprendiendo esto, te puedes controlar tus funciones y ver que codigo quieres que se ejecute cuando se genera un click y en donde.

Espero que me haya hecho entender :)

Por Lunaty

Claber

118 de clabLevel



Genero:Femenino  

Flash Developer & RM Email Support for Google

chrome

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.