如何在Flex库项目中嵌入MultiDPIBitmapSource对象

时间:2013-10-16 15:36:41

标签: actionscript-3 flex mxml

我目前将嵌入的图像存储在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中定义一个非可视类吗?

1 个答案:

答案 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实践。但它应该有用。