Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    39

    Restringere campo di azione di un listener

    per farla breve ho un file (chiamiamolo1.fla) che nella main timeline ha un listener di questo tipo:
    codice:
    stage.addEventListener(Event.RESIZE, centraOggetti);
    stage.dispatchEvent(new Event(Event.RESIZE));
    function centraOggetti(evento:Event):void
    {
    
    //istruzioni
    
    
    }
    poi ho un altro file (chiamiamolo 2.fla) che nella main timeline ha un lo stesso tipo di listener:

    codice:
    stage.addEventListener(Event.RESIZE, ridimensiona);
    stage.dispatchEvent(new Event(Event.RESIZE));
    function ridimensiona(evento:Event):void
    {
       
    //istruzioni
    		
    }
    Il problema sorge quando carico il file 2.fla dentro un mc chiamato "gallery"contenuto in 1.fla:

    codice:
    function loadswf (e:Event):void
    {
    	
    	l.load(new URLRequest("2.swf"));
    
    		
    		
    		gallery.addChild(l);
    		
    }


    praticamente in questo modo allo stage di 1.fla viene aggiunto anche il listener del file caricato, e rimane anche dopo che lo scarico con removechild causando errori di questo tipo quando faccio un resize di 1.fla



    TypeError: Error #1009: Impossibile accedere a una proprietà o a un metodo di un riferimento oggetto null. at 2_fla::MainTimeline/ridimensiona()


    Volevo sapere se c'era un modo per restringere il campo d'azione del listener di 2.fla solo alla sua timeline

    spero di essere stato chiaro!

    ciao

  2. #2
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    All'interno di un filmato lo stage è univoco. Pertanto se carichi un secondo filmato che ha un altro listener sullo stage, dovrai poi preoccuparti di rimuoverlo quando scarichi il secondo filmato.
    Puoi fare questo usando ad esempio un listener sullo stesso 2.fla che si attiva quando rimuovi il filmato (Event.REMOVED_TO_STAGE).

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    39
    quindi se ho capito bene sulla timeline di 2.fla dovrei aggiungere:

    codice:
    stage.addEventListener(Event.REMOVED_TO_STAGE, scarica);
    
    function scarica(evento:Event):void;
    {
       
    stage.removeEventListener(Event.RESIZE, ridimensiona);
    		
    }
    è esatto?

  4. #4
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    No, il listener di rimozione deve essere assegnato a this

    this.addEventListener(Event.REMOVED_TO_STAGE, scarica);

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    39
    facendo così


    codice:
    this.addEventListener(Event.REMOVED_TO_STAGE, scarica);
    
    function scarica (evento:Event):void
    {
      
    stage.removeEventListener(Event.RESIZE, ridimensiona3);
    		
    }
    stop();

    mi da errore

    TypeError: Error #2007: Il valore del parametro type deve essere diverso da null.
    at flash.events::EventDispatcher/addEventListener()
    at about_fla::MainTimeline/frame1()

  6. #6
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    Mmh... vedo di fare un test appena posso, può darsi che sia necessario inserire un controllo in più per evitare errori in esecuzione.

  7. #7
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    Originariamente inviato da and80
    Mmh... vedo di fare un test appena posso, può darsi che sia necessario inserire un controllo in più per evitare errori in esecuzione.
    Ecco in realtà avevo proprio sbagliato il nome dell'evento, non lo ricordavo. Il nome dell'evento è Event.REMOVED_FROM_STAGE

    Con questo piccolo codice di esempio, funziona alla perfezione:

    Codice PHP:
    this.addEventListener(Event.REMOVED_FROM_STAGEremovedFromStageHandler);
    function 
    removedFromStageHandler (evt:Event):void {
        
    trace(evt);
    }
    stage.addEventListener(MouseEvent.CLICKclickHandler);
    function 
    clickHandler (evt:MouseEvent):void {
        
    stage.removeChild(this);

    A te dovrebbe bastare scrivere questo:

    Codice PHP:
    this.addEventListener(Event.REMOVED_FROM_STAGEremovedFromStageHandler);
    function 
    removedFromStageHandler (evt:Event):void {
        
    stage.removeEventListener(Event.RESIZEridimensiona3);


  8. #8
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    39
    Funziona perfettamente, grazie

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.