如何使用ActionScript管理移动应用中的图像资源大小?

时间:2012-02-10 00:39:38

标签: actionscript-3 flex mobile flex4.5

由于iPhone的屏幕密度,图像资产开发得更大。因此,在指定图标和图像时,Flex组件采用此形式。

<s:ViewNavigator id="tab1" label="Tab1 width="100%" height="100%" firstView="views.Tab1">
        <s:icon>
            <s:MultiDPIBitmapSource source160dpi="@Embed('assets/tabIcon.png')"/>
        </s:icon>
</s:ViewNavigator>

Flex当然会正确地渲染它并将大小调整到应该的大小。

然而,当我自己加载图像时,它们看起来会被炸毁,因为它们的尺寸会翻倍。

这是我在覆盖标签栏时使用它的方法。

public class TabbedViewNavigatorTabBarSkin extends ButtonBarSkin
{

    [Embed (source="/assets/tabBar.png" )]
    private var TabBarPng:Class;

    override protected function createChildren():void
    {
        var bgb:Bitmap = new TabBarPng() ;

        addChild(bgb);
    }
}

这是图像出现爆炸的时候。我做错了什么?

1 个答案:

答案 0 :(得分:1)

我认为你想要做的事情可以通过以下代码实现,这基本上会否定内部完成的工作,根据屏幕尺寸扩展资产,同时允许它扩展其他基于DPI的组件,我不确定这将如何在实践中发挥作用。

        import mx.core.mx_internal;

...

        var bgb : Bitmap = new TabBarPng();
        bgb.scaleX = 1 / systemManager.mx_internal::densityScale;
        bgb.scaleY = 1 / systemManager.mx_internal::densityScale;

或我认为的另一种可能性是:

        var mul : MultiDPIBitmapSource = new MultiDPIBitmapSource();
        mul.source160dpi = new TabBarPng();

        var bgb : BitmapImage = new BitmapImage();
        bgb.source = mul;

        var gr : Graphic = new Graphic();
        gr.width = 100 / systemManager.mx_internal::densityScale; //not sure if you'd want densityScale being applied here or what?  Same below just a matter of testing on more devices
        gr.height = 100 / systemManager.mx_internal::densityScale;
        gr.addElement(bgb)
        addChild(gr);

[来自MultiDPIBitmapSource API doc]

此类提供各种运行时密度的位图列表。它作为BitmapImage或Image的源提供,并作为Button的图标提供。组件将使用Application.runtimeDPI来选择要显示的图像。

我认为这个文档:

http://help.adobe.com/en_US/flex/mobileapps/WS19f279b149e7481c682e5a9412cf5976c17-8000.html

可能仍然是你能找到的最明确的解释,虽然它不完全清楚这会在不同设备上运行时如何影响应用程序。最好的选择是尽可能多地测试设备(或需要支持)。