About

<#TEMPLATE_INCLUDE_NINEPAGE_ABOUTME#>
  • Nov

    14

    在使用 Robotlegs2  (简称RL2)作为 MVC 设计框架时,Adobe AIR 如果采用了多个窗口,那么如果生成子窗口(独立窗口),它所对应的 mediator 并不会自动创建。这是因为 Context 是以当前舞台作为上下文背景,而独立的子窗口在生成时,它拥有自己的舞台实例,并不与主窗口共享同一个舞台实例。这在 RL1 中比较难以解决的问题,在 RL2 中比较很容易解决。

    默认情况下,在 AppConfig.as 中配置好了映射,并不会进行多窗口通信,还需要打开子窗口时进行类似如下的操作:

    先在打开的操作处添加视图管理的注入:

    [Inject] 
    public var viewManager:IViewManager;

    然后在视图管理对象中先加到这个子窗口对象(打开之后可以直接移除它):

    var someWin:SomeWindowView = new SomeWindowView ();
    viewManager.addContainer(someWin);
    someWin.open();
    viewManager.removeContainer(someWin);

    如果在打开后没有在视图管理对象中移除,那么也可以在子窗口对应的 mediator 对象中注入 viewManager 与 view 对象,然后在 destroy() 方法中移除它。 

    override public function destroy():void
    {
        super.destroy();
        trace(this,"destroy()");

        viewManager.removeContainer(view);
    }

    Nov

    13

    默认情况下如果直接 new SomeWindow() 生成一个窗口对象(SomeWindow 继承自 Window),并且直接调用它的 open() 方法后,它在打开时的坐标是随意的,而需求往往可能是新建窗口时的坐标要随着父窗口居中显示。

    我们可以通过在 windowComplete 事件侦听器中可以重新定位它的坐标,但由于整个窗口初始化从添加到舞台,到窗口大小的变化,再到整个 windowComplete 事件的发生都是异步的,并且由于 Flex 采用延迟刷新的方式,在 new 一个新窗口生成到它被定位,整个窗口会有一个视觉上的瑕疵:它看起来像是一个窗口在生成后从一个坐标突然跳到了另一个位置(很突兀)。

    所以一种比较好的方式是先将它的 visible 属性设为 false,样例代码:

    //在调用位置直接将它设为false
    var win:SomeWindow= new SomeWindow();
    win.open();
    win.visible = false;

    然后在 SomeWindow 窗口内部重现它(以顶级窗口作为居中参考对象),nice:

    private function windowCompleteHandler(event:AIREvent):void
    {
        var _win:NativeWindow = FlexGlobals.topLevelApplication.nativeWindow;

        this.nativeWindow.x = _win.x + ((_win.width - this.nativeWindow.width) >> 1);
        this.nativeWindow.y = _win.y + ((_win.height - this.nativeWindow.height) >> 1);

        this.visible = true;
        this.activate();
    }

    Mar

    12

     在 Adobe AIR 运行时环境中,Window 是 AIR 桌面应用程序中其它窗口的顶级容器,它除了最大化窗口功能(maximize())外,还可以使用全屏功能(StageDisplayState.FULL_SCREEN_INTERACTIVE)。但在全屏功能中它有一个“小陷井”,在某些情况下,如果按了ESC键或CTRL+S键这后,它有可能会退出全屏模式,甚至还会让窗口变的只剩两个滚动条(这应该是 Adobe AIR Window 留下的Bug)。不过可以通过对舞台(stage)实例添加全局的键盘事件(KeyboardEvent.KEY_DOWN)来屏蔽这情况:

    if(e.keyCode == Keyboard.ESCAPE)
    e.preventDefault();
    if(e.keyCode == 83 && e.ctrlKey)
    e.preventDefault()

    More...

    Jan

    15

    样例代码主要有以下功能:

    1. 简单继承window类创建MyWindow。加入parentWindow属性以及advOpen()方法, 设置MyWindow默认样式。

    2. 从主程序中弹出窗口1,从窗口1中弹出窗口2。每个窗口里有image和button

    3. 窗口1可以关闭主程序窗口,窗口2可以关闭窗口1。(关闭父窗口)

    DEMO下载:AIRPopupWindowDemo.zip

    转自:http://bbs.airia.cn/Share/thread-2762-1-1.aspx