Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [FLEX 3] Problema con mouseChildren

    Ola, sto usando Flex Builder 3. Ecco il codice:

    Codice PHP:
    <?xml version="1.0" encoding="utf-8"?>
    <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" verticalAlign="middle" >
        <mx:Script>
            <![CDATA[
                import flash.events.MouseEvent;
                import mx.controls.Alert;

                private function open():void{
                    tendina.stop();
                    tendina.duration=1000;
                    tendina.xFrom=menuslide.x;
                    tendina.xTo=0;
                    tendina.play();
                    }
                    
                private function close():void{
                    tendina.stop();
                    tendina.duration=1000;
                    tendina.xFrom=menuslide.x;
                    tendina.xTo=-240;
                    tendina.play();
                    }

                public function clicked(event:MouseEvent):void{
                    Alert.show(event.target.id);
                    }
                
                public function init():void{
                    var Buttons:Array = menus.getChildren();
                    menuslide.addEventListener(MouseEvent.CLICK, clicked);
                    for each( var s:Button in Buttons){
                    s.addEventListener(MouseEvent.CLICK, clicked);
                    }
                }
                
            ]]>
        </mx:Script>
        <mx:Move id="tendina" target="{menuslide}" />
        <mx:Panel id="pannello" layout="absolute" title="STOCAZZO.com" 
                    width="95%" height="95%" paddingTop="5" paddingLeft="10" 
                    paddingRight="10" paddingBottom="5" >

            <mx:Canvas id="menuslide" backgroundColor="#CBCBCB" borderStyle="solid"    x="-240" 
                        mouseChildren="false" mouseOver="open();" mouseOut="close();" initialize="init();">

            <mx:HBox id="menus" width="100%">
                <mx:Button id="Button1" label="Ciao1"/>
                <mx:Button id="Button2" label="Ciao2"/>
                <mx:Button id="Button3" label="Ciao3"/>
                <mx:Button id="Button4" label="Ciao4"/>
                <mx:Button id="Button5" label="Ciao5"/>
            </mx:HBox>
        </mx:Canvas>

        </mx:Panel>

    </mx:Application>
    Ok, spiego esattamente il problema dove sta. Stavo realizzando un semplice menu a comparsa quando ci passi sopra col mouse. Inizialmente il problema era che quando passavo sul Canvas ed il mouse si trovava su un button praticamente perdeva l'evento mouseOver del canvas e praticamente è come se si verificasse un MouseOut.
    Quindi ho usato la proprietà mouseChildren sul canvas in modo da annullare l'attivazione dell'evento quando passava sui button.
    Ed ha iniziato a funzionare correttamente.

    Lo step successivo sarebbe stato quello di abilitare il click dei bottoni...ma così come l'ho fatto sopra non va. L'evento click si verifica sul canvas e non sui bottoni. Come posso risolvere la cosa?
    Scusa, e di che ti meravigli?
    Secondo te, tra la morte di Gesù e la sua Resurrezione...
    ...chi è stato il "Figlio di Dio ad interim"?

  2. #2
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    utilizzando la proprietà mouseChildren=false stai disabilitando ogni azione legata al mouse per gli elementi contenuti dentro al "titolare" della proprietà, compreso il click negli stessi elementi
    potresti provare ad utilizzare la proprietà currentTarget all'interno della funzione legata al click per vedere se i pulsanti interni vengono letti e se così fosse, puoi decidere di dare una diversa azione ad ognuno in modo che se il click avviene nell'area di pertinenza di un clip evenga eseguita solo quella
    una cosa forse un po' contorta, ma dovrebbe risolvere la questione se funziona

  3. #3
    Se intendi così:
    Codice PHP:
    <?xml version="1.0" encoding="utf-8"?>
    <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" verticalAlign="middle" >
        <mx:Script>
            <![CDATA[
                import flash.events.MouseEvent;
                import mx.controls.Alert;

                private function open():void{
                    tendina.stop();
                    tendina.duration=1000;
                    tendina.xFrom=menuslide.x;
                    tendina.xTo=0;
                    tendina.play();
                    }
                    
                private function close():void{
                    tendina.stop();
                    tendina.duration=1000;
                    tendina.xFrom=menuslide.x;
                    tendina.xTo=-240;
                    tendina.play();
                    }

                public function clicked(event:MouseEvent):void{
                    Alert.show(event.currentTarget.id);
                    }
                
                public function init():void{
                    var Buttons:Array = menus.getChildren();
                    menuslide.addEventListener(MouseEvent.CLICK, clicked);
                    /*
                        for each( var s:Button in Buttons){
                        s.addEventListener(MouseEvent.CLICK, clicked);
                        }
                    */
                }
                
            ]]>
        </mx:Script>
        <mx:Move id="tendina" target="{menuslide}" />
        <mx:Panel id="pannello" layout="absolute" title="STOCAZZO.com" 
                    width="95%" height="95%" paddingTop="5" paddingLeft="10" 
                    paddingRight="10" paddingBottom="5" >

            <mx:Canvas id="menuslide" backgroundColor="#CBCBCB" borderStyle="solid"    x="-240" 
                        mouseChildren="false" mouseOver="open();" mouseOut="close();" initialize="init();">

            <mx:HBox id="menus" width="100%">
                <mx:Button id="Button1" label="Ciao1"/>
                <mx:Button id="Button2" label="Ciao2"/>
                <mx:Button id="Button3" label="Ciao3"/>
                <mx:Button id="Button4" label="Ciao4"/>
                <mx:Button id="Button5" label="Ciao5"/>
            </mx:HBox>
        </mx:Canvas>

        </mx:Panel>

    </mx:Application>
    ci ho già provato ma anche passando sopra i button rimane attivo menuslide come current target.
    Scusa, e di che ti meravigli?
    Secondo te, tra la morte di Gesù e la sua Resurrezione...
    ...chi è stato il "Figlio di Dio ad interim"?

  4. #4
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    sì ho provato anche io dopo aver scritto il post
    mi sa che l'unica è gestire le posizioni rispetto al mouse
    in pratica le azioni vengono gestite completamente dal clip contenitore e quando ci si clicca sopra si verifica la posizione del mouse rispetto al clip stesso e se ricade nella posizione di uno dei pulsanti si attiva una funzione in relazione al pulsante su cui si è sopra
    penso che basti utilizzare l'hitTest per fare questa verifica, anche se non ho provato

  5. #5
    Tu pensa che io invece stavo pensando di abbandonare l'idea di mouseChildren, riabilitarlo e gestire anche il mouseOver dei button che continuerebbero a muovere la slide.
    Il punto è che volevo crearmi un componente riutilizzabile.
    Scusa, e di che ti meravigli?
    Secondo te, tra la morte di Gesù e la sua Resurrezione...
    ...chi è stato il "Figlio di Dio ad interim"?

  6. #6
    Ok questa proprio non me l'aspettavo. Guarda il nuovo codice:
    codice:
    <?xml version="1.0" encoding="utf-8"?>
    <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" verticalAlign="middle" xmlns:Componenti="Componenti.*">
    	<mx:Script>
    		<![CDATA[
    			import flash.events.MouseEvent;
    			import mx.controls.Alert;
    
    			private function open():void{
    				tendina.stop();
    				tendina.duration=1000;
    				tendina.xFrom=menuslide.x;
    				tendina.xTo=0;
    				tendina.play();
    				}
    				
    			private function close():void{
    				tendina.stop();
    				tendina.duration=1000;
    				tendina.xFrom=menuslide.x;
    				tendina.xTo=-240;
    				tendina.play();
    				}
    
    			public function clicked(event:MouseEvent):void{
    				Alert.show(event.currentTarget.id);
    				}
    			
    			public function init():void{
    				var Buttons:Array = menus.getChildren();
    				for each( var s:Button in Buttons){
    					s.addEventListener(MouseEvent.CLICK, clicked);
    				}
    			}
    			
    		]]>
    	</mx:Script>
    	<mx:Move id="tendina" target="{menuslide}" />
    	<mx:Panel id="pannello" layout="absolute" title="STOCAZZO.com" 
    				width="95%" height="95%" paddingTop="5" paddingLeft="10" 
    				paddingRight="10" paddingBottom="5" >
    
    		<mx:Canvas id="menuslide" backgroundColor="#CBCBCB" borderStyle="solid"	x="-240" 
    					rollOver="open();" rollOut="close();" initialize="init();">
    
    			<mx:HBox id="menus" width="100%">
    				<mx:Button id="Button1" label="Ciao1"/>
    				<mx:Button id="Button2" label="Ciao2"/>
    				<mx:Button id="Button3" label="Ciao3"/>
    				<mx:Button id="Button4" label="Ciao4"/>
    				<mx:Button id="Button5" label="Ciao5"/>
    			</mx:HBox>
    		</mx:Canvas>
    
    	</mx:Panel>
    
    </mx:Application>
    Ho semplicemente tolto la proprietà mouseChildren dalla dichiarazione del Canvas e ho lasciato però la init con l'addEventListener ai bottoni.
    Puoi provarmela per vedere funziona pure a te? E se ti funziona, che significa? Come è possibile?
    Io ho pensato che l'unica cosa plausibile sia che gestendo l'evento Click sui buttons gli ho detto implicitamente che il resto degli eventi li gestisco io quindi non li considerare se non li dichiaro io, ma se fosse così ho avuto un culo celestiale a provare in questo modo.
    Scusa, e di che ti meravigli?
    Secondo te, tra la morte di Gesù e la sua Resurrezione...
    ...chi è stato il "Figlio di Dio ad interim"?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.