【问题标题】:AIR - Resizing Native Window ProportionatelyAIR - 按比例调整本机窗口大小
【发布时间】:2011-07-11 12:20:32
【问题描述】:

我的应用程序以 1000 x 500 的舞台大小、2:1 的纵横比启动。本机窗口具有系统镶边,它总是会高几个像素。

如何只允许原生窗口按比例调整大小以始终保持舞台的 2:1 纵横比?

以下代码无法按我的预期工作:

package
{
//Imports
import flash.display.NativeWindow;
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.events.NativeWindowBoundsEvent;

//Class
[SWF(width="1000", height="500", frameRate="60", backgroundColor="#000000")]
public class WindowTest extends Sprite
    {
    //Constants
    private static const ASPECT_RATIO:Number = 2.0; //2:1 Aspect Ratio

    //Constructor
    public function WindowTest()
        {
        init();
        }

    //Initialization
    private function init():void
        {
        stage.scaleMode = StageScaleMode.NO_SCALE;
        stage.align = StageAlign.TOP_LEFT;
        stage.nativeWindow.addEventListener(NativeWindowBoundsEvent.RESIZE, windowResizeEventHandler);
        }

    //Window Resize Event Handler
    private function windowResizeEventHandler(evt:NativeWindowBoundsEvent):void
        {
        evt.currentTarget.width = stage.stageHeight * ASPECT_RATIO;
        }
    }
}

【问题讨论】:

    标签: actionscript-3 air resize window


    【解决方案1】:

    阻止默认事件,手动调整窗口大小:
    编辑:看来,空气正在以一种奇怪的方式计算宽度,所以为了防止在开始时闪烁,在 SWF 标记中将窗口大小设置为 1050x500。

    package{
    import flash.display.Sprite;
    import flash.display.StageAlign;
    import flash.display.StageScaleMode;
    import flash.events.Event;
    import flash.events.NativeWindowBoundsEvent;
    
    //Class
    [SWF(width="1000", height="500", frameRate="60", backgroundColor="#000000")]
    public class airtest extends Sprite
    {
        //Constants
        private static const ASPECT_RATIO:Number = 2.0; //2:1 Aspect Ratio
    
        //Constructor
        public function airtest()
        {
            init();
        }
    
        //Initialization
    
    
    private function init():void
        {
            stage.scaleMode = StageScaleMode.NO_SCALE;
            stage.align = StageAlign.TOP_LEFT;
            stage.nativeWindow.addEventListener(NativeWindowBoundsEvent.RESIZING, windowResizeEventHandler);
        }
    
        private function windowResizeEventHandler(evt:NativeWindowBoundsEvent):void
        {
            evt.preventDefault()
            if (evt.beforeBounds.width != evt.afterBounds.width){//user resizes width
                evt.currentTarget.width = evt.afterBounds.width
                evt.currentTarget.height = evt.afterBounds.width/ASPECT_RATIO;
            } else if (evt.beforeBounds.height != evt.afterBounds.height){
                evt.currentTarget.height = evt.afterBounds.height
                evt.currentTarget.width = evt.afterBounds.height*ASPECT_RATIO;
            }
    
        }
    }
    }
    

    【讨论】:

    • 它适用于我.. 你需要 beta flex 4.5 来编译 Air actionscript 项目。错误是什么?
    • 我正在使用带有 AIR 2.5 SDK 的 Flash Professional CS5。为什么我需要 Flex SDK?没有错误。窗口根本不会调整大小。
    • hmh 也许是因为当我尝试它时,我将类命名为 airtest?您将其命名为 WindowTest
    • 不,我更改了类名和构造函数 - 否则无法编译。我在 ADL 中运行你的代码。 evt.preventDefault();导致事件不发生且不触发后续代码,但移除 evt.preventDefault();导致窗口不按比例调整大小。似乎在这两种情况下,后续代码都被忽略了。当我将程序作为 AIR 应用程序发布和运行时,也会发生同样的事情。
    • 我在 Flex 4.5 Beta 中编译它,一切都很好。我只改了windowResizeEventHandler函数,将事件从NativeWindowBoundsEvent.RESIZE修改为NativeWindowBoundsEvent.RESIZING。代码应执行以下操作: NativeWindowBoundsEvent.RESIZING 事件在检测到用户交互时发生,但在窗口的实际参数更改之前。我取消了这个事件,因为我想手动调整窗口大小。 evt.beforeBounds 包含原始窗口大小,evt.afterBounds 包含用户交互后的窗口大小。
    猜你喜欢
    • 2012-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-15
    • 2012-08-29
    • 2014-07-21
    • 1970-01-01
    相关资源
    最近更新 更多