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

时间:2011-05-03 20:11:19

标签: ios actionscript-3 flex flash-builder 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设备上。我不能说它如何在别人身上发挥作用。我已通过打印结果并在调试器中运行它来确认这些结果。

3 个答案:

答案 0 :(得分:4)

简答:

最简单的方法是使用 stage.fullScreenWidth stage.fullScreenHeight 属性。

他们在启动时正确报告任何方向和任何平台的屏幕大小(无需等待ADDED_TO_STAGE或RESIZE事件)。

更多详情:

Android Blackberry 上,当使用以下任何属性时,AIR会随时报告相同(和正确的值):

  • stage.stageWidth& stage.stageHeight
  • Screen.mainScreen.bounds.width& Screen.mainScreen.bounds.height
  • stage.fullScreenWidth& stage.fullScreenHeight

iOS 上,启动时,这三种语法会给出三种不同的结果(以下示例值适用于在横向模式下在iPad2上运行的应用程序):

  • stage.stageWidth / Height:启动swf时的默认舞台大小(500x375)
  • Screen.mainScreen.bounds:纵向模式下屏幕的物理分辨率(768x1024)
  • stage.fullScreenWidth / Height:给定方向的正确屏幕分辨率。 (1024x768 - 更正)

请注意,在iOS上,应用程序启动时会触发两次RESIZE事件,但这些值只是第二次正确(stage.stageWidth == stage.fullScreenWidth)。

答案 1 :(得分: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);
    }
}

另一个选择是调度一个假的resize事件,并在延迟过后让你的前一个旋转代码处理它:

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

答案 2 :(得分:0)

在App Start上

public function Main()
{
    loaderInfo.addEventListener(Event.COMPLETE, _onComplete_loaderInfo);
}

private function _onComplete_loaderInfo(__e:Event):void
{
    // I should now have access to stage.stageWidth/stage.stageHeight.
}

获取屏幕资源的工作?我想说,我没有对此进行任何研究,我只是在搜索其他内容并遇到了你的问题,只是大声评论。 现在,我并不是说它们是正确的值,但它们至少应该 NOT 为零。