7

我正在构建一组 Flash 组件,它们能够将组件的皮肤替换为库中的另一个组件。

目前,我可以在运行应用程序后访问库,但不能在实时预览期间访问,我想知道组件在实时预览模式下运行时是否可以访问库(您可以拖动的模式舞台周围的组件并在“组件参数”窗口中更改其属性)

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

    }

}

谢谢!

4

2 回答 2

0

我不完全确定您已经尝试过什么来解决这种情况。但希望这可能会有所帮助。

右键单击库中的 MovieClip,选择 Linkage 并为其命名,即。我的东西。

在您的代码中,

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

希望这有助于或让您更接近解决方案。

于 2012-08-10T23:38:09.410 回答
0

这在 LivePreview 中对我有用,只要我在 configUI 中应用它,而不是绘制:

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

注意:当我在编辑组件的 FLA 上工作时,位图仅从库中不一致地显示。有时有效,有时无效。但是,当我导出 SWC,然后将组件导入另一部电影时,它每次都能正常工作,无论是在 LivePreview 中还是在运行时。

更新 这似乎在 CS6 中不起作用,除非符号已经嵌入到组件中。SWC 我想看看我是否可以欺骗它,通过在 SWC 中嵌入一个图像,然后在目标文件。这没有用,但它确实指出了我如何做到这一点:

在此处输入图像描述

所以,这有点费力,但你可以通过以下方式解决这个问题:

1) 为组件 SWC 中的每个属性创建一个虚拟资产。2)在部署组件的文件中使用自定义类覆盖它

...所有这些都可能比它的价值更麻烦,但它应该为问题提供解决方案。

于 2012-08-26T15:27:58.750 回答