我目前将嵌入的图像存储在flex库项目(swc)中,如下所示:
public class BitmapAssets
{
[Embed(source="/assets/icon_160.png")]
public static const icon_160:Class;
[Embed(source="/assets/icon_240.png")]
public static const icon_240:Class;
[Embed(source="/assets/icon_240.png")]
public static const icon_240:Class;
}
然后我在其他项目中引用图像。例如:
<s:Button>
<s:icon>
<s:MultiDPIBitmapSource source160dpi="{BitmapAssets.icon160}"
source240dpi="{BitmapAssets.icon240}"
source320dpi="{BitmapAssets.icon320}" />
</s:icon>
</s:Button>
我想要做的是将MultiDPIBitmapSource嵌入库项目中;然后我可以将代码减少到这个:
<s:Button icon="{MultiDPIBitmapAssets.icon}" />
但是,我无法弄清楚如何嵌入填充了source160 / 240/320值的MultiDPIBitmapSource对象。
感激地收到任何解决方案;)
编辑:
作为'真正'嵌入的替代方案,我想知道mxml编译是否能提供答案。例如,如果我有一个mxml声明:
<fx:declarations>
<s:MultiDPIBitmapSource id="icon"
source160dpi="{BitmapAssets.icon160}"
source240dpi="{BitmapAssets.icon240}"
source320dpi="{BitmapAssets.icon320}" />
</fx:declarations>
然后mxml编译器将其转换为:
var icon:MultiDPIBitmapSource = new MultiDPIBitmapSource();
icon.source160dpi = BitmapAssets.icon160;
icon.source240dpi = BitmapAssets.icon240;
icon.source320dpi = BitmapAssets.icon320;
然后我可以按照我的意愿引用它:
<s:Button icon="{MultiDPIBitmapAssets.icon}" />
从技术上讲,它不是嵌入式的。但出于实际目的,它(至少在我看来)。问题是,我在哪里放置声明标签?我可以在mxml中定义一个非可视类吗?
答案 0 :(得分:1)
MultiDPIBitmapSource
是在运行时创建的对象,而不是在编译时创建的对象。您将无法在应用程序中嵌入它的实例。
但是,您可以创建对象的静态引用。它需要更多的代码,但每次需要使用它时编写的代码就会少一些。
public class Assets {
private static var _asset:MultiDPIBitmapSource;
public static function get asset():MultiDPIBitmapSource {
if ( !_assets ) {
_assets = new MultiDPIBitmapSource();
_assets.source160 = "url";
_assets.source240 = "url";
_assets.source320 = "url";
_assets.source480 = "url";
}
return _assets;
}
}
然后使用它:
<s:Button icon="{Assets.asset}"/>
因此它基本上将源视为迷你单身人士。我个人不是这种方法的粉丝。你获得的唯一好处是每个类中的代码略少,但是你失去了灵活性,这违背了一般的OOP实践。但它应该有用。