Comunidad de diseño web y desarrollo en internet online

¡Captura de eventos entre clases distintas con dispatchEvent!

Citar            
MensajeEscrito el 17 Feb 2012 05:47 pm
Hola a todos, me he leido todo lo referente a dispatchEvent y no doy con la solución. Creo que me voy a volver loco porque si no puedo con esto no sé cómo voy a continuar...

Quiero hacer una aplicación para android con Flex 4.6, y lo que tiene que hacer es interactuar con un mapa de google.

Para ello, en la MXML principal creo un mapa y lo planto, después desde otro MXML tengo una barra con botones que deben interactuar con el mapa creado en el MXML principal.

Para cambiar el tipo de mapa por ejemplo creo un botón y le digo que al hacer click me dispare un evento. Luego en el MXML lo debe recoger para que el mapa cambie. Pues esto es justo lo que no sé hacer y he probado mil cosas.

Os pongo el código del MXML principal, el MXML de la botonera y una captura de pantalla para que lo veais de un golpe. A ver si me podeis decir cómo hacer esto para poder continuar!




Eventos.mxml (principal)

Código :

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
            xmlns:mx="library://ns.adobe.com/flex/mx"
            xmlns:s="library://ns.adobe.com/flex/spark"
            
            xmlns:contenedores="todo.contenedores.*"
            xmlns:clases="todo.clases.*"
            
            xmlns:maps="com.google.maps.*"
            
            creationComplete="init()">
   
   <fx:Script>
      <![CDATA[
         import com.google.maps.MapType;
   //      import todo.contenedores.bottom_bar;
         
         public function init():void{
            addEventListener(MouseEvent.CLICK, mainButtonClicked);
         }
         
         // mainButtonClicked ejecuta la función indicada dependiendo del botón que haya lanzado el evento.
         public function mainButtonClicked(event:Event):void
         {
            var selectedButton:String = String(event.target.id);
            switch (selectedButton) 
            {
               case "b_relieve":    map.setMapType(MapType.PHYSICAL_MAP_TYPE);      break;
               case "b_normal":     map.setMapType(MapType.NORMAL_MAP_TYPE);       break;
               case "b_hibrido":     map.setMapType(MapType.HYBRID_MAP_TYPE);       break;
               case "b_satelite":  map.setMapType(MapType.SATELLITE_MAP_TYPE);    break;
            }
         }            
      
      ]]>
   </fx:Script>
   
   
   <!-- Creación del mapa. -->
   <clases:MapCentral id="map" width="100%" height="100%" />
   
   <!--Inclusión de la barra de botones-->
   <contenedores:bottom_bar x="71" y="710"/>
   
</s:Application>


Barra de botones: buttom_bar.mxml

Código :

<?xml version="1.0" encoding="utf-8"?>
<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009"
       xmlns:s="library://ns.adobe.com/flex/spark">
   
   <s:HGroup>
      
   <s:CalloutButton id="b_mapas" label="Tipo de Mapa" verticalPosition="before">
      <s:calloutContent>
         <s:BorderContainer>
            <s:layout>
               <s:VerticalLayout paddingTop="10" paddingBottom="10" paddingLeft="10" paddingRight="10" gap="10"/>
            </s:layout>
            
            <s:Button label="Relieve"   id="b_relieve"  
                    click="{this.dispatchEvent(new MouseEvent(MouseEvent.CLICK, false))}" />
            
            <s:Button label="Satélite"    id="b_satelite" 
                    click="{this.dispatchEvent(new MouseEvent(MouseEvent.CLICK, false))}" />
            
            <s:Button label="Híbrido"   id="b_hibrido" 
                    click="{this.dispatchEvent(new MouseEvent(MouseEvent.CLICK, false))}" />
            
            <s:Button label="Mapa"       id="b_normal" 
                    click="{this.dispatchEvent(new MouseEvent(MouseEvent.CLICK, false))}" />
            
         </s:BorderContainer>
      </s:calloutContent>
   </s:CalloutButton>
   
   <!--Otro grupo de botones-->
   <s:CalloutButton id="b_otro" label="otro boton" verticalPosition="before">
      <s:calloutContent>
         <s:BorderContainer>
            <s:layout>
               <s:VerticalLayout paddingTop="10" paddingBottom="10" paddingLeft="10" paddingRight="10" gap="10"/>
            </s:layout>
            
            <s:Button label="otro"/>
            <s:Button label="otro"/>
            <s:Button label="otro"/>
            <s:Button label="otro"/>
            <s:Button label="otro"/>
         </s:BorderContainer>
      </s:calloutContent>
   </s:CalloutButton>
   
   </s:HGroup>
</s:Group>   



Gracias de antemano por la ayuda!!

Por ctwkkk

3 de clabLevel



Genero:Masculino  

Informático musical :)

chrome
Citar            
MensajeEscrito el 17 Feb 2012 06:26 pm
seguro que estas añadiendo el evento MouseEvent.CLICK a los botones o al objeto de visualizacion principa?

Código ActionScript :

public function init(): void
{
     addEventListener(MouseEvent.CLICK, mainButtonClicked);
}

Por Yonomimi

76 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 17 Feb 2012 06:50 pm
Los eventos los genera la barra de botones, y el listener tienes que agregársela escuchando esa barra. Dale un id para simplificar

<contenedores:bottom_bar id="barra" x="71" y="710"/>

Luego donde tienes

addEventListener(MouseEvent.CLICK, mainButtonClicked);

cambialo por

barra.addEventListener(MouseEvent.CLICK, mainButtonClicked);

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 18 Feb 2012 11:28 am
Hola chicos gracias por las respuestas, pues le puse como dice Jorge el identificador a la barra, pero cuando hago:

barra.addEventListener(MouseEvent.CLICK, mainButtonClicked);

y pincho en alguno de los botones del CallOutButton lo que me devuelve como event.targer.id es el ID de la Barra, no del botón que he presionado.

¿Cómo lo he arreglado?
pues me ha tocado poner un addEventListener diferente para cada botón, en vez de con MouseEvent.CLICK con uno personalizado con un simple String:

bottom_bar.addEventListener("NORMAL", cambiarMapa,false,0,true);
bottom_bar.addEventListener("HIBRIDO", cambiarMapa,false,0,true);
bottom_bar.addEventListener("SATELITE", cambiarMapa,false,0,true);
bottom_bar.addEventListener("RELIEVE", cambiarMapa,false,0,true);

El problema es que ya no puedo usar un simple addEventListener que detecta el id del botón, ahora tengo que añadir uno por cada botón, lo cual multiplica por cuatro el número de addEventListener....

Como que no es muy eficiente no?

Si quereis puedo subir los archivos del proyecto para que lo echéis un vistazo.

Por ctwkkk

3 de clabLevel



Genero:Masculino  

Informático musical :)

chrome
Citar            
MensajeEscrito el 18 Feb 2012 12:18 pm
has probado en vez de

event.target.id

por

event.currentTarget.id

saludos

Por Yonomimi

76 de clabLevel



Genero:Masculino  

firefox

 

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