首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >正确防止Flex移动应用程序中的方向更改

正确防止Flex移动应用程序中的方向更改
EN

Stack Overflow用户
提问于 2012-01-18 03:55:54
回答 2查看 6.2K关注 0票数 4

有没有人能让它在Flex SDK 4.6中正常工作?

下面是一小段代码:

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="utf-8"?>
<s:View xmlns:fx="http://ns.adobe.com/mxml/2009" 
        xmlns:s="library://ns.adobe.com/flex/spark" 
        addedToStage="onAddedToStage(event)"
        title="Title">
    <fx:Script>
        <![CDATA[  
            private function onAddedToStage(event:Event):void { 
                if (stage.autoOrients) {
                    stage.addEventListener(StageOrientationEvent.ORIENTATION_CHANGING, orientationChanging, false, 0, true);
                }
            }

            private function orientationChanging(event:StageOrientationEvent):void {
                if (event.afterOrientation == StageOrientation.DEFAULT || event.afterOrientation == StageOrientation.UPSIDE_DOWN) {
                    event.preventDefault(); 
                }     
            } 
        ]]>
    </fx:Script>
</s:View>

我试图实现的是在两个方向上都支持横向模式,所以如果用户将设备旋转180度,屏幕也应该旋转。但当用户将设备旋转到其中一个纵向方向时,应该根本不会有任何操作。相反,我看到导航器操作栏的宽度发生了变化,有时内容是纵向的,所以显然阻止事件是不够的。我使用Adobe推荐的“官方”方式,但问题是它的效果不是很好。诚然,阶段没有改变,但似乎在导航器中触发了一些东西,因为你可以看到操作栏的宽度发生了变化。

我在handler方法中显式地将布局边界设置为固定宽度取得了一些成功-这阻止了更改actionbar宽度,但这只是一个临时的解决方案-如果视图是一个转换的主题,或者其他一些重绘-它将再次呈现错误的大小。好像下面有什么东西告诉它它是在肖像模式下,即使我试图阻止它。

在你引爆像"autoOrient = false“这样的愚蠢想法之前,请不要这样做。这显然不是解决这个问题的办法。很明显,这是Flex SDK的一个错误--有人找到了修复它的方法或稳定的变通方法吗?

编辑:显然其他人也遇到了类似的问题:

  • http://forums.adobe.com/message/3969531 (主要主题是关于其他方面的,但请阅读magic robots的comment)
  • http://forums.adobe.com/message/4130972
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-19 01:48:26

我不确定这是否是正确的,我最后做错了什么,但经过很多努力,我发现这是一个稳定的解决方案:

代码语言:javascript
运行
复制
private function onAddedToStage(event:Event):void { 
    if (stage.autoOrients) {
        stage.removeEventListener(StageOrientationEvent.ORIENTATION_CHANGING, orientationChanging);
        stage.addEventListener(StageOrientationEvent.ORIENTATION_CHANGING, orientationChanging, false, 100, true);
    }
}      

private function orientationChanging(event:StageOrientationEvent):void {
    event.stopImmediatePropagation();
    if (event.afterOrientation == StageOrientation.DEFAULT || event.afterOrientation == StageOrientation.UPSIDE_DOWN) {
        event.preventDefault(); 
    }   
}  

首先要注意的是,在移动应用程序中,addedToStage会触发几次(2-3次)。我不知道为什么,很明显,我的代码中没有addChild。也许AIR运行时会做一些其他的事情。因此,为了避免添加不必要数量的处理程序,常见的技术是首先删除处理程序-如果这样的处理程序还没有注册,它不会做任何事情,但如果有,它将删除它,这将保持处理程序计数为1。

第二件事是事件的优先级-它不会在0上工作,它必须设置在大的东西上,在AIR运行时中的东西之前启动。

最后一件事- event.stopImmediatePropagation() -现在,我们是第一个处理事件的人,我们不能阻止这个事件在这个特定的场景中被进一步发送。

这使得方向无法完美地工作-对我来说,横向和反转的横向(rotated_left,rotated_right)正在工作和过渡,而纵向模式根本不影响视图。

现在,这里有一个危险-你可能想要在离开视图时删除侦听器(在过渡动画结束,视图停用或其他什么时候),因为stopImmediatePropagation将阻止在应用程序的其他部分处理事件。

我希望Adobe (或者现在的Apache )能更仔细地研究这个问题,并追踪我的解决方案。

编辑

这个解决方案还有最后一个问题,那就是如果应用程序在设备处于默认或UPSIDE_DOWN方向时启动,在这种情况下,应用程序将处于纵向模式。

要解决此问题,解决方案是在addedToStage处理程序中更改纵横比:

代码语言:javascript
运行
复制
   if(Stage.supportsOrientationChange) {
         stage.setAspectRatio(StageAspectRatio.LANDSCAPE);
    }
票数 6
EN

Stack Overflow用户

发布于 2012-05-30 06:52:55

所以我遇到了和你一样的问题。我想我终于找到解决方案了。这是我所做的:

代码语言:javascript
运行
复制
<s:TabbedViewNavigatorApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
...blahblahblah...
width="1024"/>

protected function tabbedviewnavigatorapplication2_applicationCompleteHandler(event:FlexEvent):void {
    stage.autoOrients=true;
    preventOrient();
} 

private function preventOrient():void { 
    if (stage.autoOrients) {
        stage.removeEventListener(StageOrientationEvent.ORIENTATION_CHANGING, orientationChanging);
    stage.addEventListener(StageOrientationEvent.ORIENTATION_CHANGING, orientationChanging, false, 100, true);
    }
}

private function orientationChanging(event:StageOrientationEvent):void {
    if(event.afterOrientation == StageOrientation.DEFAULT || event.afterOrientation == StageOrientation.UPSIDE_DOWN || event.afterOrientation == StageOrientation.UNKNOWN) {
        event.preventDefault(); 
    }
}

值得注意的是,在应用程序完成处理程序中,我将stage.autoOrients设置为true,因为在app.xml文件中,我将其设置为false,这是因为有一个闪屏,并且不希望用户在此期间重新调整屏幕方向。实际上,我唯一不同的是说明了StageOrientation.UNKNOWN并阻止了它的作用,在主mxml文件中将宽度设置为1024(对于iPad屏幕,对于其他平板设备可能会有所不同),并删除了停止立即传播。希望这能有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8900849

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档