有没有人能让它在Flex SDK 4.6中正常工作?
下面是一小段代码:
<?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的一个错误--有人找到了修复它的方法或稳定的变通方法吗?
编辑:显然其他人也遇到了类似的问题:
发布于 2012-01-19 01:48:26
我不确定这是否是正确的,我最后做错了什么,但经过很多努力,我发现这是一个稳定的解决方案:
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处理程序中更改纵横比:
if(Stage.supportsOrientationChange) {
stage.setAspectRatio(StageAspectRatio.LANDSCAPE);
}发布于 2012-05-30 06:52:55
所以我遇到了和你一样的问题。我想我终于找到解决方案了。这是我所做的:
<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屏幕,对于其他平板设备可能会有所不同),并删除了停止立即传播。希望这能有所帮助。
https://stackoverflow.com/questions/8900849
复制相似问题