2012-07-04 69 views
6

Sto costruendo un set di componenti Flash con la possibilità di sostituire la skin del componente con un altro nella libreria.Impossibile avere Flash Component (SWC) accedere alla libreria in anteprima dal vivo

Attualmente, sono in grado di accedere alla libreria dopo aver eseguito l'applicazione, ma non durante l'anteprima dal vivo e vorrei sapere se è possibile che il componente acceda alla libreria mentre è in esecuzione in modalità anteprima live (la modalità dove è possibile trascinare il componente intorno al palco e modificarne le proprietà nella finestra Parametri componente)

Here is a simplified code that just looks to see if there is a symbol of the name specified and than instantiates it and adds it as a child.

package 
{ 
    import fl.core.UIComponent; 
    import flash.display.MovieClip; 
    import flash.system.ApplicationDomain; 

    /** 
    * ... 
    * @author Roy Lazarovich 
    */ 
    public class CompTest extends UIComponent 
    { 
     private var customfile :String; 

     public function CompTest() 
     { 

     } 

     override protected function configUI():void 
     { 

     } 

     override protected function draw():void 
     { 
      super.draw(); 
     } 

     private function setCustomFile():void 
     { 
      if (ApplicationDomain.currentDomain.hasDefinition(customfile)) 
      { 
       var c:Class = Class(ApplicationDomain.currentDomain.getDefinition(customfile)); 
       var mc:MovieClip = new c(); 
       addChild(mc); 
      } 
     } 

     [Inspectable(name = "_Custom File", defaultValue = "")] 
     public function set _customfile(value:String):void 
     { 
      customfile = value; 
      setCustomFile(); 

      drawNow(); 
     } 

    } 

} 

Grazie!

+0

Qualche fortuna nel risolvere questo? –

+0

Hai incluso le librerie nel tuo percorso? – michael

+0

Intendi includere la posizione della libreria client nei percorsi per il componente? Non sono sicuro che sia del tutto fattibile: abbiamo un paio di librerie client che usano i nostri componenti. Oppure intendi includere il percorso del client nel client .fla ?? –

risposta

0

Non sono completamente sicuro di ciò che hai già provato a risolvere questa situazione. Ma spero che questo possa aiutare.

Fare clic con il pulsante destro del mouse sul MovieClip nella libreria, selezionare Concatenamento e assegnargli un nome di classe, ad es. MyThing.

Nel codice,

newMyThing = new MyThing(); 
this.addChild(newMyThing); 
trace("tada!"); 

Speranza che aiuta o ti avvicina a una soluzione.

+0

"MyThing" non è noto al momento della pubblicazione, è impostato come una proprietà sul componente. Nella migliore delle ipotesi, useresti 'getDefinitionByName', tuttavia fallisce. Quando si pubblica il file .fla utilizzando il componente, funziona correttamente. Il problema risiede nell'Anteprima dal vivo del componente che non è in grado di creare un'istanza dal.libreria di fla nell'anteprima dal vivo sul palco dell'IDE. –

0

Questo funziona per me in LivePreview, finché io applico in configUI, e non disegnare:

public class EditableBitmap extends UIComponent 
{ 
    protected var placeholder:String = "None"; 
    protected var bitmap:Bitmap; 
    protected var scale:Number = 1; 

    [Inspectable(name = "Placeholder", type = String, defaultValue="None")] 
    public function set Placeholder($value:String):void 
    { 
     placeholder = $value; 
     configUI(); 
    } 
    public function get Placeholder():String { return placeholder; } 

    public function EditableBitmap() 
    { 
     //Console.Debug("NEW EditableBitmap"); 
     super(); 
    } 

    override protected function configUI():void 
    { 
     //Console.Debug("EditableBitmap configUI: " + width); 
     if (!isNaN(width)) 
     { 
      wDim = width; 
      hDim = height; 
      graphics.clear(); 
      graphics.beginFill(0x000000, 0.1); 
      graphics.drawRect(0, 0, wDim, hDim); 
     } 
     if (placeholder != "None" && placeholder != "") 
     { 
      var asset:Class = getDefinitionByName(placeholder) as Class; 
      var data:BitmapData = new asset() as BitmapData; 
      bitmap = new Bitmap(data); 
     } 
     super.configUI(); 
    } 

    override protected function draw():void 
    { 
     if (bitmap) 
     { 
      addChild(bitmap); 
      bitmap.x = off_x * scale; 
      bitmap.y = off_y * scale; 
      bitmap.scaleX = bitmap.scaleY = scale; 
     } 
    } 
} 

NOTA: Quando sto lavorando sul FLA in cui mi sono la modifica del componente, la bitmap viene visualizzata solo dalla libreria incoerente. A volte funziona, a volte no. Ma quando esporto il SWC e poi importa il componente in un altro film, funziona sempre, sia in LivePreview che in runtime.

UPDATE Sembra che questo non funziona in CS6 a meno che il simbolo è già incorporato nel componente .swc Volevo vedere se riuscivo a ingannarlo, inserendo un'immagine nella SWC e poi sostituendolo con un altro con lo stesso nome nel file di destinazione. Questo non ha funzionato, ma mi ha fatto puntare a come si può fare questo:

enter image description here

Quindi, è un po 'laboriosa, ma si potrebbe aggirare il problema:

1) Creazione di un risorsa fittizia per ogni proprietà nel componente SWC. 2) Sovrascrivere questo utilizzando una classe personalizzata nel file in cui si distribuisce il componente

... i quali possono essere più problemi di quanti ne valga la pena, ma che dovrebbero fornire una soluzione al problema.

+0

Non appena sono in grado di testare questo, riporterò le mie conclusioni. Grazie per averlo pubblicato. È possibile che il mio codice di test (sembra simile, ma leggermente diverso dal tuo) semplicemente fallisce quando si tratta di font. –

+0

Fammi sapere cosa trovi - maggiori dettagli potrebbero restringere il campo a un'altra soluzione. LivePreview può essere un po 'instabile, ma nella mia esperienza di solito solo quando si crea il componente, non una volta che è stato pubblicato su swc. – JcFx

+0

Sto provando a replicare quello che hai fatto qui. I miei componenti non ereditano dal magazzino UIComponent o UIObject poiché devono essere eseguiti su una console e quelli sono un po 'pesanti per questo. Certo, il mio bisogno è per i caratteri, e non funziona. Sto cercando di rintracciare ciò che è diverso/mancante. Le mie versioni di UIComponent e UIObject non hanno una funzione configUI. Il tuo è basato sullo standard UIComponent? AS2 o AS3? –

Problemi correlati