Flex 4.5移动iOS问题,确定实际的屏幕/阶段分辨率

Ric*_*sky 6 apache-flex actionscript-3 flash-builder ios flex4.5

我有一个相当大的问题.我希望这是由于我自己的愚蠢,而不是某种错误.我有需要知道屏幕尺寸的代码.我还没有找到一种可行的方法.在iPad 2和iPhone4/iPod Touch 4 iOS设备上使用Flash Builder 4.5的生产版本.一般来说,我的应用程序运行良好但我无法确定程序启动时的屏幕大小和方向.让我解释一下我遇到的问题:

在进入"init"函数时,由ADDED_TO_STAGE事件调用的函数,stage.stageHeight和stage.stageWidth的值都为0.

我可以查询Capabilities.screenResolutionX和Capabilities.screenResolutionY,但它们是错误的.它们具有原始X和Y值,但不管方向如何.所以例如我通过screenResolutionX以横向模式开始包含768(或其他)而不是1024.

我查看stage.width和stage.height的值,它们没有有效值.

我有一个针对EVENT.RESIZE的onResize函数设置,但是如果应用程序在已经处于横向模式时从设备启动时它不会被调用.如果我以纵向模式启动应用程序然后旋转,则会调用它.

所以我的问题是我应该在应用程序启动时查询应该知道应用程序的真实宽度和高度.必须有办法做到这一点,但显然不使用上述任何方法!

顺便说一句,这是在iOS设备上.我不能说它如何在别人身上发挥作用.我已经通过打印结果并在调试器中运行它来确认这些结果.

gra*_*ukt 1

我之前遇到过 stageWidth 和 stageHeight 在启动时没有立即给出正确值的问题,解决这个问题的一个简单方法是等待一两帧,然后再检查它们。

一种选择是延迟应用程序的初始化,大致如下:

private var _startup_delay:int = 10;

public function Constructor(){
    addEventListener(Event.ENTER_FRAME, handleEnterFrame);
}

public function handleEnterFrame(e:Event):void{
    _startup_delay--;
   if(_startup_delay <= 0){
       init();
       removeEventListener(Event.ENTER_FRAME, handleEnterFrame);
    }
}
Run Code Online (Sandbox Code Playgroud)

另一种选择是调度一个假的调整大小事件,并让您之前的旋转代码在延迟过去后处理它:

public function handleEnterFrame(e:Event):void{
    _startup_delay--;
   if(_startup_delay <= 0){
       stage.dispatchEvent(new Event(Event.RESIZE));
       removeEventListener(Event.ENTER_FRAME, handleEnterFrame);
   }
}
Run Code Online (Sandbox Code Playgroud)

  • 我也明白这些价值观。相反,我建议使用 fullStageWidth 和 fullStageHeight。我刚刚编写了一些可靠返回值的代码。基本上它使用 stage.orientation 来检查“default”或“upsideDown”。其中任何一个都表示纵向模式,并且 fullStageWidth 和 fullStageHeight 中的值应该没问题。当我找到横向模式时,我会查看高度是否 &gt; 宽度(如 Capability.screenResolutionX/Y 所示),并交换值,只要方向为横向并且 h &gt; w。Kludgy by 已证明 100% 有效,并且不需要您等待 ADDED_TO_STAGE 之后。 (2认同)