2016-06-24 101 views
6

Ho provato SWFLoader, ma il problema è che il contenuto caricato è MovieClip e non so come interagire con esso e MovieClip # numChildren è zero.Come caricare un swf e interagire con esso?

E a proposito, non posso passare il flashvars al swf.

+0

La proprietà è 'numChildren', e probabilmente il SWF che si sta caricando è scritto in modo tale da aggiungere il suo contenuto direttamente a' stage'. – Vesper

+0

@Vesper quindi come potrei interagire con esso? MovieClip # stage return null. –

+0

Mentre aspetti una risposta relativa a SWFLoader/Flex ... Cosa succede se usi il codice AS3 (all'interno di un '') per caricare il tuo SWF usando l'API 'Loader' ecc.? –

risposta

3

In primo luogo, dovresti sapere che non esiste una risposta esatta alla tua domanda in quanto dipende dal tuo SWF caricato (lo sai o meno, il suo elenco di visualizzazione, ...) ma metterò un semplice esempio per spiegare cose e devi adattarlo al tuo caso.

Per questo esempio, diciamo che abbiamo un SWF molto semplice (il file SWF caricato) che contiene un campo di testo (chiamato txt_url) e un pulsante (un MovieClip, chiamato btn_go).

Il pulsante btn_go apre l'URL immesso nel campo di testo txt_url.

Per il nostro secondo SWF (caricatore), useremo un oggetto Loader per caricare il nostro primo (che in questo caso sarà la Loader.content) e quindi si imposterà l'URL (testo txt_url) ed eseguire la fare clic su evento sul pulsante btn_go.

Così qui è un esempio del codice del nostro loader.swf:

var loader:Loader = new Loader(); 
    loader.contentLoaderInfo.addEventListener(Event.COMPLETE, on_SWFLoad); 
    loader.load(new URLRequest('loaded.swf')); 
    addChild(loader); 

function on_SWFLoad(e:Event): void 
{ 
    // get our loaded SWF 
    var loaded_swf:DisplayObjectContainer = DisplayObjectContainer(loader.content); 

    // because we know our target objects, we can use "getChildByName()" 
    // set the URL 
    TextField(loaded_swf.getChildByName('txt_url')).text = 'http://www.example.com'; 

    // open the URL in the browser by triggering the click event on the "btn_go" button 
    MovieClip(loaded_swf.getChildByName('btn_go')).dispatchEvent(new MouseEvent(MouseEvent.CLICK));  
} 

Questo esempio impostare direttamente e aprire l'URL nel browser dopo aver caricato il file SWF, ovviamente possiamo eseguire l'azione dopo aver cliccato un pulsante o qualcos'altro ma è solo un semplice esempio per mostrarvi come è possibile ...

Ora, il problema è quando non sappiamo nulla del file SWF caricato e dei suoi figli (nomi, profondità, .. .), in questo caso dovremmo fare più sforzi per fare ciò che vogliamo: dovremmo attraversare l'intero elenco di visualizzazione del file SWF caricato per identificare gli oggetti di destinazione.

Tornando al nostro esempio e diciamo che sappiamo solo che ci sono una TextField e un pulsante in fase, quindi il nostro codice può essere come questo per esempio:

function on_SWFLoad(e:Event): void 
{ 
    var loaded_swf:DisplayObjectContainer = DisplayObjectContainer(loader.content); 
    var num_children:int = loaded_swf.numChildren; 

    for(var i:int = 0; i < num_children; i++) 
    { 
     var child:DisplayObject = loaded_swf.getChildAt(i); 

     if(child is TextField) 
     { 
      trace(child.name);   // gives : txt_url 
      TextField(child).text = 'http://www.example.com'; 
     } 
     else 
     { 
      if(child.hasEventListener(MouseEvent.CLICK)) 
      { 
       trace(child.name);  // gives : btn_go 
       child.dispatchEvent(new MouseEvent(MouseEvent.CLICK)); 
      } 
     } 
    } 
} 

Anche in questo caso, si tratta di un molto semplice ad esempio solo per mostrare come possiamo procedere ...

...

Poi sui valori che passano (params) tra i fondi sovrani, date un'occhiata su my answer of this question dove si ha un piccolo esempio per questo.

Per ulteriori informazioni su Display programming (elenco di visualizzazione, oggetto di visualizzazione, contenitore di oggetti di visualizzazione, ...) dare un'occhiata a here.

Spero che possa essere d'aiuto.