2012-07-04 28 views
6

Tôi đang xây dựng một bộ thành phần Flash có khả năng thay thế lớp vỏ của thành phần bằng một thành phần khác trong thư viện.Không thể có Flash Component (SWC) truy cập thư viện trong bản xem trước trực tiếp

Hiện tại, tôi có thể truy cập thư viện sau khi chạy ứng dụng, nhưng không phải trong khi xem trước trực tiếp và tôi muốn biết liệu thành phần có thể truy cập thư viện trong khi chạy ở chế độ xem trước trực tiếp hay không nơi bạn có thể kéo các thành phần xung quanh sân khấu và thay đổi thuộc tính của nó trong cửa sổ thông số component)

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

    } 

} 

Cảm ơn!

+0

Có may mắn trong việc giải quyết vấn đề này không? –

+0

Bạn có bao gồm các thư viện trong đường dẫn của mình không? – michael

+0

Bạn có nghĩa là bao gồm vị trí của thư viện khách trong đường dẫn cho thành phần không? Tôi không chắc điều đó hoàn toàn khả thi - chúng tôi có một vài trăm thư viện khách hàng sử dụng các thành phần của chúng tôi. Hoặc bạn có nghĩa là bao gồm đường dẫn ứng dụng khách trong ứng dụng khách .fla ?? –

Trả lời

0

Tôi không hoàn toàn chắc chắn những gì bạn đã cố khắc phục tình huống này. Nhưng hy vọng điều này có thể hữu ích.

Nhấp chuột phải vào MovieClip trong thư viện của bạn, chọn Liên kết và đặt cho nó tên lớp, ví dụ: Những thứ của tôi.

Trong code của bạn,

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

Hy vọng rằng sẽ giúp hoặc giúp bạn gần gũi hơn với một giải pháp.

+0

"MyThing" không được biết tại thời điểm xuất bản, nó được đặt làm thuộc tính trên thành phần. Tốt nhất, bạn nên sử dụng 'getDefinitionByName', tuy nhiên nó không thành công. Khi xuất bản .fla sử dụng thành phần, nó hoạt động tốt. Vấn đề nằm ở bản xem trước trực tiếp của thành phần không thể khởi tạo từ.thư viện của fla vào Live Preview trên sân khấu trong IDE. –

0

này làm việc cho tôi trong LivePreview, miễn là tôi áp dụng nó trong configUI, và không rút ra:

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

LƯU Ý: Khi tôi đang làm việc trên các FLA nơi tôi đang chỉnh sửa các thành phần, bitmap chỉ được hiển thị từ thư viện không nhất quán. Đôi khi nó hoạt động, đôi khi nó không. Nhưng khi tôi xuất SWC và sau đó nhập thành phần vào một bộ phim khác, nó hoạt động mọi lúc, trong LivePreview cũng như khi chạy.

CẬP NHẬT Có vẻ như điều này không làm việc trong CS6 trừ biểu tượng đã được nhúng trong phần .SWC tôi muốn xem liệu tôi có thể lừa nó, bằng cách nhúng một hình ảnh trong SWC và sau đó thay thế nó bằng một tên khác trong cùng một tệp đích. Đây không hiệu quả, nhưng nó đã chỉ cho tôi làm thế nào bạn có thể làm điều này:

enter image description here

Vì vậy, đó là một chút khó nhọc, nhưng bạn có thể làm việc này bằng cách:

1) Tạo tài sản giả cho mỗi thuộc tính trong SWC thành phần. 2) Ghi đè điều này bằng cách sử dụng lớp tùy chỉnh trong tệp nơi bạn triển khai thành phần

... tất cả điều này có thể gặp nhiều rắc rối hơn giá trị nhưng cần cung cấp giải pháp cho vấn đề.

+0

Ngay sau khi tôi có thể kiểm tra điều này, tôi sẽ báo cáo lại với những phát hiện của tôi. Cảm ơn bạn đã đăng nó. Có thể là mã thử nghiệm của tôi (có vẻ tương tự, nhưng hơi khác với mã của bạn) đơn giản là không thành công khi nói đến phông chữ. –

+0

Hãy cho tôi biết những gì bạn tìm thấy - nhiều chi tiết hơn có thể thu hẹp nó xuống một giải pháp khác. LivePreview có thể là một chút flaky, nhưng trong kinh nghiệm của tôi thường chỉ khi bạn đang authoring các thành phần, không một khi nó được xuất bản để một swc. – JcFx

+0

Tôi đang cố gắng sao chép những gì bạn đã làm ở đây. Các thành phần của tôi không được kế thừa từ UIComponent hoặc UIObject cổ phiếu vì chúng cần chạy trên một giao diện điều khiển và những thứ này hơi nặng nề. Tất nhiên, nhu cầu của tôi là dành cho phông chữ và điều đó không hiệu quả. Tôi đang cố gắng theo dõi những gì khác biệt/mất tích. Các phiên bản UIComponent và UIObject của tôi không có chức năng configUI. Là của bạn dựa trên UIComponent tiêu chuẩn? AS2 hoặc AS3? –

Các vấn đề liên quan