在actionscript中动态创建一个类

时间:2009-07-17 07:29:34

标签: flex actionscript-3 embedded-resource dynamic-class

让我先说明问题。 我需要在没有嵌入的情况下从外部加载我在项目中使用的所有图像。 图像存在于皮肤中或作为树中项目的图标。 我遇到了IconUtility类here 我能够修改它并将它用于树,但问题是我们不能使用相同组件的象兼容性来设置2个不同的皮肤(比如按钮 - upskin downkin)。 我无法想到具有象似性的解决方法。 是否可以模拟嵌入并动态创建类并在运行时返回类?

2 个答案:

答案 0 :(得分:0)

This正是我所寻找的...不幸的是,作者声称他无法将其用于按钮皮肤

答案 1 :(得分:0)

完成这些操作最简单的方法是创建一个/多个包含资产的swfs,加载它,然后从那里提取类(即从加载的swfs应用程序域中)...

有多种解决方案:

  • 硬核版本是使用URLLoader将这些图片加载到ByteArray,然后创建一个新的ByteArray,它将是一个swf文件,包含嵌入的资源和链接它们的必要说明和班级......你可能想看看spark swfassist ......
  • 更简单,更高效(因为你只做过一次),就是在服务器上做到这一点......在这里你可以
    • 只需使用flex compiler
    • 即可
    • 使用swfmill
    • 使用一些库来操作swf,例如ming
    • 亲自动手......:)

希望有所帮助

编辑第二个解决方案是关于在服务器上创建资产,使用合适的工具......或者自己编写工具,但这更像是一个笑话...... :) ..我意识到,flex编译器的链接是错误的...想法是简单地将它插入你的web服务器,然后让它编译一些ActionScript,这将做嵌入...所以你会生成一个像这样的ActionScript文件:

package {
    import flash.display.Sprite;
    import flash.utils.describeType;
    public class Assets extends Sprite {
        [Embed(source='asset_1_Location')]
        public static var asset_1:Class;
        [Embed(source='asset_2_Location')]
        public static var asset_2:Class;
        ...
        [Embed(source='asset_n_Location')]
        public static var asset_n:Class;    
        public function Assets() { }
        public static function getAll():Object {
            var ret:Object = { };
            for each (var x:XML in describeType(Assets).variable.(@type=="Class")) {
                var name:String =  x.@name;
                ret[name] = Assets[name];
            }
            return ret;
        }
    }
}

然后让flex编译器对其进行编译...加载后,使用LoaderInfo :: applicationDomain.getDefinition(“Assets”)。getAll()提取数据,它将为您提供包含所需所有类的键值映射。 ..

使用其他工具,它的工作方式会有所不同,但我希望这可以澄清它应该如何运作......

在服务器上,你需要一个服务,为你构建这些资产swfs,并缓存它们......所以你发送一些POST请求,例如你需要的JSON数组文件/图像,以及它我会给你回swf ...当然服务器应该做适当的缓存......

希望,现在它有助于......:)

格尔茨

back2dos