Apache Royale 0.9.8开发中如何正常引用SWC库内的图片资源
问题根源
当前引用SWC内图片失败,是编译规则和引用逻辑不匹配导致的:
- Apache Royale编译到JSRoyale目标时,放在
js-library-path的SWC默认仅做代码逻辑编译,不会自动解包SWC内部存储的图片等媒体资源到最终Web输出目录。代码中写的裸字符串路径"images/visualizar_agenda.png"会被解析为输出目录下的本地静态文件路径,自然出现加载失败。 - 裸字符串引用不会触发编译器的资源识别流程,编译器根本不知道你需要用到SWC里的这张图片,自然不会做资源打包。
调整方案
1. 修正asconfig.json编译配置
在现有配置基础上补充资源输出路径声明,确保图片SWC走正确的资源编译流程:
- 保留
js-library-path中libs/images.swc的配置,不要把这类带媒体资源的SWC移到js-external-library-path(该路径下的SWC仅做外部代码引用,不会触发资源解包) - 新增
js-resource-output-path配置,指定SWC内资源解包后的输出目录
修正后的完整配置:
{ "compilerOptions": { "source-map": true, "targets": [ "JSRoyale" ], "js-external-library-path": [ "${royalelib}/js/libs/MXRoyaleJS.swc", "${royalelib}/js/libs/JewelJS.swc" ], "js-library-path": [ "libs/images.swc" ], // 新增:配置SWC内资源的输出路径 "js-resource-output-path": "assets" }, "files": [ "src/HelloRoyale.mxml" ] }
2. 调整代码中的资源引用方式
替换裸字符串路径为Royale支持的资源引用语法,让编译器识别需要打包的SWC资源:
- 在AS逻辑代码中,通过
[Embed]元数据声明引用的SWC内资源 - 在MXML标签中,用
@Embed注解替代裸字符串资源路径
修正后的代码片段:
<fx:Script> <![CDATA[ // 用Embed元数据关联SWC内的图片资源 [Embed(source="images/visualizar_agenda.png")] internal static var iconAgenda:Class; [Embed(source="images2/visualizar_agenda.png")] internal static var iconAgenda2:Class; public function init():void{ imagem.source = iconAgenda; imagem2.source = iconAgenda2; } ]]> </fx:Script> <j:Image id="imagem"/> <!-- MXML标签内直接用@Embed引用SWC内图片 --> <j:Image source="@Embed(source='images/afericao.png')"/>
按照这种写法,编译器会自动遍历js-library-path下的SWC包,匹配对应路径的图片资源,按照配置输出到指定目录,同时自动修正Image组件的资源请求路径,不会出现加载失败。
3. 旧SWC兼容写法
如果你的SWC是从老Flex项目迁移来的,内部已经为每张图片定义了对应的资源类,可以直接在代码中引用这些类,不需要手动写路径和Embed注解:
// 示例:直接引用SWC内已经定义好的资源类 import images.visualizar_agenda; imagem.source = visualizar_agenda;
踩坑注意事项
- 大小写必须完全匹配:代码中写的图片路径要和SWC内部存储的图片路径大小写完全一致,Web环境下路径是大小写敏感的
- 路径配置不要混放:存储媒体资源的SWC必须放在
js-library-path中,放到js-external-library-path下不会触发资源打包 - 源码文件夹内的本地图片不需要Embed注解,直接写相对路径即可正常加载,和SWC资源的引用逻辑不冲突。
内容的提问来源于stack exchange,提问作者Piltsen
相关产品推荐
相关产品推荐

