初始化时Adobe空气加载进度条

时间:2013-09-09 12:04:14

标签: flex air

我正在尝试使用加载进度条快速显示应用程序窗口(Adobe Air),直到加载了windowedApplication的所有组件。我试图做的是与Adobe默认为Flex做的非常相似的事情,但奇怪的是不适用于Air。

我试图逃避我的应用程序在执行后启动的“空白15秒等待时间”。基本上,如果没有预加载器,它对用户来说非常混乱,因为在单击应用程序图标后没有可视响应(窗口等)可能导致用户尝试将其打开两次/三次以上。我只想要让用户忙于预加载器/启动画面的东西。

类似的内容发布在Adobe的网站上: - http://livedocs.adobe.com/flex/3/html/help.html?content=layoutperformance_07.html#172599

我查看了Adobe AIR - Custom Preloader with Image

的答案

然而,导致我在过去15天内未找到解决方案的以下问题: -

User Login validation and preloader in Adobe Air

示例项目 您可以在链接到我的保管箱帐户文件后下载示例项目: - https://www.dropbox.com/s/n43hdsmil6ox6js/preloader.fxp

可以在Flash构建器中打开项目(我使用的是SDK 4.6,因此您可能必须更改应用程序描述符,以防您在不同的sdk版本上进行编译/运行)并运行它以获取登录屏幕。登录与

用户/密码

然后注意UI /应用程序窗口如何无响应并停止响应5-10秒 ..即使Alt + Tab到窗口也不起作用!

它基本上没有任何逻辑数据 - 我只是确保有很多UI组件,以便增加UI创建时间。

我要做的是让应用程序窗口继续响应,并在模态对话框中显示进度/加载消息

1 个答案:

答案 0 :(得分:2)

如果我正确理解了这个问题,听起来你需要建立一个Modular Application。我们的想法是尽可能在主应用程序中放置尽可能少的代码/资产,并将其用作代码其余部分的入口点。我提供的链接应该涵盖所有细节,但这是基本的想法:

MyApplication.mxml

<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:mx="library://ns.adobe.com/flex/mx"
                       xmlns:s="library://ns.adobe.com/flex/spark">

    <fx:Script>
        <![CDATA[
            import mx.events.FlexEvent;

            protected function login_clickHandler(event:MouseEvent):void
            {
                trace("login_clickHandler(event)");

                this.moduleLoader.url = "MyModule.swf";
                this.moduleLoader.loadModule();

                this.currentState = "loading";

            }

            protected function moduleLoader_updateCompleteHandler(event:FlexEvent):void
            {
                trace("moduleLoader_updateCompleteHandler(event)");

                this.moduleLoader.removeEventListener(FlexEvent.UPDATE_COMPLETE, moduleLoader_updateCompleteHandler);
                this.currentState = "ready";
            }
        ]]>
    </fx:Script>

    <s:states>
        <s:State name="login" />
        <s:State name="loading" />
        <s:State name="ready" />
    </s:states>

    <s:ModuleLoader id="moduleLoader" top="0" left="0" bottom="0" right="0"
                    updateComplete="moduleLoader_updateCompleteHandler(event)" />

    <s:Button label="Login" horizontalCenter="0" verticalCenter="0" includeIn="login" click="login_clickHandler(event)" />

    <mx:ProgressBar id="progressBar" source="{this.moduleLoader}" horizontalCenter="0" verticalCenter="0"
                    includeIn="loading" />

</s:WindowedApplication>

MyModule.mxml

<s:Module xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:mx="library://ns.adobe.com/flex/mx"
          xmlns:s="library://ns.adobe.com/flex/spark" width="100%" height="100%"
          creationComplete="module1_creationCompleteHandler(event)">

    <fx:Script>
        <![CDATA[
            import mx.events.FlexEvent;

            /**
             * Let's embed a video to simulate load time..
             */
            [Embed(source = "VID_20130603_212046.mp4", mimeType = "audio/mpeg")]
            private static const VIDEO_SOURCE:Class;

            protected function module1_creationCompleteHandler(event:FlexEvent):void
            {
                trace("MyModule.module1_creationCompleteHandler(event)");

            }
        ]]>
    </fx:Script>

    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>

    <s:Panel top="40" left="40" bottom="40" right="40">

        <s:Label text="Hello World" horizontalCenter="0" verticalCenter="0" />

    </s:Panel>

</s:Module>

这将使主应用程序窗口的启动时间降至最低,并在加载所有重型资源之前为您提供一个入口点。

<强>更新

在查看更新中的示例项目后,您只需在ViewStack中设置creationPolicy =“auto”,而不是“all”。将其设置为all将尝试在单个更新中实例化堆栈中的每个视图,这几乎可以保证锁定线程。

这很可能对你的用例来说已经足够了,而不必乱用模块。