2012-07-04 8 views
6

Ich erstelle eine Reihe von Flash-Komponenten mit der Fähigkeit, die Skin der Komponente durch eine andere in der Bibliothek zu ersetzen.Die Flash-Komponente (SWC) kann nicht auf die Bibliothek in der Live-Vorschau zugreifen.

Momentan kann ich nach dem Ausführen der Anwendung auf die Bibliothek zugreifen, aber nicht während der Live-Vorschau, und ich würde gerne wissen, ob die Komponente während des Live-Vorschau-Modus auf die Bibliothek zugreifen kann wo können Sie die Komponente auf der Bühne herum ziehen und seine Eigenschaften im Komponentenparameter-Fenster)

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(); 
     } 

    } 

} 

Dank ändern!

+0

Haben Sie Glück dabei? –

+0

Haben Sie die Bibliotheken in Ihren Pfad aufgenommen? – michael

+0

Meinen Sie, den Speicherort der Clientbibliothek in die Pfade für die Komponente aufzunehmen? Ich bin mir nicht sicher, ob das überhaupt möglich ist - wir haben ein paar hundert Client-Bibliotheken, die unsere Komponenten verwenden. Oder meinen Sie, den Client-Pfad in Client .fla ?? –

Antwort

0

Ich bin mir nicht ganz sicher, was Sie bereits versucht haben, diese Situation zu beheben. Aber das könnte hoffentlich helfen.

Klicken Sie mit der rechten Maustaste auf den MovieClip in Ihrer Bibliothek, wählen Sie Linkage und geben Sie ihm einen Klassennamen, z. Meine Sache.

in Ihrem Code

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

Hoffnung, das Ihnen hilft oder wird zu einer Lösung näher.

+0

"MyThing" ist zur Veröffentlichungszeit nicht bekannt, es wird als Eigenschaft für die Komponente festgelegt. Im besten Fall würden Sie 'getDefinitionByName' verwenden, es schlägt jedoch fehl. Bei der Veröffentlichung der. Fla mit der Komponente funktioniert es gut. Das Problem liegt in der Live-Vorschau der Komponente, die nicht von der Instanz instanziiert werden kann.Fla-Bibliothek in die Live-Vorschau auf der Bühne in der IDE. –

0

Das ist für mich in Livepreview funktioniert, solange ich es in configui gelte, und nicht zeichnen:

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; 
     } 
    } 
} 

HINWEIS: Wenn ich auf dem FLA zu arbeiten, wo ich die Komponente bin die Bearbeitung, Die Bitmap wird nur aus der Bibliotheksinkonsistenz angezeigt. Manchmal funktioniert es, manchmal nicht. Aber wenn ich die SWC exportiere und dann die Komponente in einen anderen Film importiere, funktioniert sie jedes Mal, sowohl in LivePreview als auch zur Laufzeit.

UPDATE Es scheint dies nicht in CS6 funktioniert es sei denn, das Symbol bereits in der Komponente eingebettet ist .swc ich sehen wollte, ob ich es betrüge könnte, um ein Bild in der SWC-Einbettung und ersetzt sie dann mit ein anderes mit demselben Namen in der Zieldatei. Das hat nicht funktioniert, aber es hat mir zu zeigen, wie Sie dies tun können:

enter image description here

Also, es ist ein bisschen umständlich, aber man konnte durch dieses Problem umgehen:

1) Erstellen eines Dummy-Asset für jede Eigenschaft in der Komponenten-SWC. 2) Überschreiben Sie dies mit einer benutzerdefinierten Klasse in der Datei, in der Sie die Komponente

... alles, was mehr Mühe als es wert ist, aber die eine Lösung für das Problem bieten sollte.

+0

Sobald ich das testen kann, werde ich mit meinen Ergebnissen berichten. Danke für das Posten. Es ist möglich, dass mein Testcode (er sieht ähnlich, aber etwas anders aus als bei Ihnen) einfach ausfällt, wenn es um Schriften geht. –

+0

Lassen Sie mich wissen, was Sie finden - mehr Details könnten es auf eine andere Lösung eingrenzen. LivePreview kann ein wenig flockig sein, aber nach meiner Erfahrung in der Regel nur, wenn Sie die Komponente erstellen, nicht einmal nach einer swc. – JcFx

+0

Ich versuche zu reproduzieren, was Sie hier getan haben. Meine Komponenten erben nicht von der UIComponent- oder UIObject-Komponente, da sie auf einer Konsole ausgeführt werden müssen und diese sind ein wenig schwer für sie. Natürlich brauche ich Schriftarten, und das funktioniert nicht. Ich versuche herauszufinden, was anders ist/fehlt. Meine Versionen von UIComponent und UIObject haben keine configUI-Funktion. Basiert Ihre auf der Standard UIComponent? AS2 oder AS3? –