Google maps Flex Google Maps API和全局函数调用问题
我正试图在AdobeAIR环境(Flex4)中构建一个基于窗口的应用程序系统(一个迷你GUI,如果您愿意的话)。在实现窗口拖动时,我通过从全局函数更新现在激活的窗口深度来说明z顺序,该函数每次访问时都会更新一个隐藏变量(确保所选窗口始终位于顶部)。(注意:我选择全局函数而不是一组事件,因为此操作的目标是立即接收返回值,而不是告诉系统的其他部分执行某些操作,因此我认为这是“使用事件在对象之间通信”的正常建议的有效例外。)我遇到了几十种创建和调用此全局函数的可能解决方案,但迄今为止唯一有效的解决方案是:Google maps Flex Google Maps API和全局函数调用问题,google-maps,apache-flex,global-variables,flex4,Google Maps,Apache Flex,Global Variables,Flex4,我正试图在AdobeAIR环境(Flex4)中构建一个基于窗口的应用程序系统(一个迷你GUI,如果您愿意的话)。在实现窗口拖动时,我通过从全局函数更新现在激活的窗口深度来说明z顺序,该函数每次访问时都会更新一个隐藏变量(确保所选窗口始终位于顶部)。(注意:我选择全局函数而不是一组事件,因为此操作的目标是立即接收返回值,而不是告诉系统的其他部分执行某些操作,因此我认为这是“使用事件在对象之间通信”的正常建议的有效例外。)我遇到了几十种创建和调用此全局函数的可能解决方案,但迄今为止唯一有效的解决方案
event.target.parentApplication.obtainNewHigherDepth()
正如您所看到的,它实际上根本不是一个全局函数调用,而是对顶级(或更顶级)父级的调用,该父级恰好包含所需的函数。在我的测试用例中,即使我将内部内容组件添加到窗口中,这也可以正常工作。但是,当添加Google地图作为窗口内容时,单击地图类型按钮会导致错误:
ReferenceError: Error #1069: Property parentApplication not found on com.google.maps.wrappers.
WrappableSprite and there is no default value.
at Window/selectWindow()[C:\Users\d04000196\Desktop\Projects\UI Concepting\ErrorExample\src\Window.mxml:18]
因此,谷歌地图API似乎试图用错误的上下文调用我的代码。作为Flex/Air的新手,我不知道如何像使用Javascript一样绑定相关上下文。但这不必要
若有更好的方法来创建和调用真正的全局函数(并使用相关的全局变量),那个么上下文不一致的问题就无关紧要了。或者,如果有一个已知的解决谷歌地图API这个特定问题的解决方案,它也可以作为一个解决方案(但不能作为未来的证明)
以下文件是说明该问题所需的最低代码
设置
Window.mxml
CustomMap.mxml
更新 在刚才的另一个问题上发现(它永远不会失败,是吗?),这是:
FlexGlobals.topLevelApplication
似乎给了我想要的东西。如果我的窗口组件曾经在这个特定的应用程序之外使用过,那么它的缺点是不安全,但是因为这不是计划中的,所以它应该足够了。尽管如此,如果有更好的解决方案,我还是很想听听。嘿,我只是快速地读了一遍,也许我错了,但我想你应该看看。它负责深度排序嘿,我只是快速阅读了一下,也许我错了,但我想你应该看看。它负责深度排序我认为您应该做的是:
addEventListener(DepthRequestEvent.REQUEST\u DEPTH,获得新的更高的深度)
addEventListener(DepthRequestEvent.REQUEST\u结果,handleDepthRequestResult)
DepthRequestEvent.REQUEST\u DEPTH
深度
值后,调度一个DepthRequestEvent.REQUEST\u结果
事件李>
handleDepthRequestResult()
函数将捕获此信息,您可以从事件参数中获取event.depthValue变量FlexGlobals.topLevelApplication.addEventListener(…。
答对了,松散耦合的类!(调用类的家长是一种拒绝)我认为您应该做的是:
addEventListener(DepthRequestEvent.REQUEST\u DEPTH,获得新的更高的深度)
addEventListener(DepthRequestEvent.REQUEST\u结果,handleDepthRequestResult)
DepthRequestEvent.REQUEST\u DEPTH
深度
值后,调度一个DepthRequestEvent.REQUEST\u结果
事件handleDepthRequestResult()
函数将捕获此信息,您可以从事件参数中获取event.depthValue变量FlexGlobals.topLevelApplication.addEventListener(…。
答对了,松散耦合的类!(调用类的父类是一种拒绝)感谢您的想法,但PopUpManager是专门为弹出窗口而构建的,存在以下问题:“PopUpManager还提供了模式,因此弹出窗口下方的窗口无法接收鼠标事件,并且如果用户在窗口外单击鼠标,也会提供一个事件,因此开发人员可以选择关闭窗口或警告用户。“我需要对整个过程有良好的控制,这意味着同时访问多个窗口和其他不寻常的东西。感谢您的想法,但PopUpManager是专门为弹出窗口而构建的,存在以下问题:“PopUpManager还提供了模式,因此弹出窗口下方的窗口无法接收鼠标事件,如果用户向外单击鼠标,也会提供一个事件
<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
width="800" height="600"
frameRate="60"
applicationComplete="init()">
<fx:Script>
<![CDATA[
// ********************
// THE PART IN QUESTION
// ********************
private var maxDepth:Number = 0;
public function obtainNewHigherDepth():Number {
return (maxDepth++);
}
private function openAMap(event:MouseEvent):void {
var window:Window = new Window();
var map:CustomMap = new CustomMap();
window.x = 160;
window.titleBarText.text = "Map"
window.content.addElement(map);
this.addElement(window);
}
private function init():void {
openMapButton.addEventListener(MouseEvent.CLICK, openAMap);
statusBar.visible = false;
}
]]>
</fx:Script>
<s:VGroup x="10" y="10" width="135" height="580">
<s:Button label="Open a Map" id="openMapButton" />
</s:VGroup>
</s:WindowedApplication>
<?xml version="1.0" encoding="utf-8"?>
<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:visuals="com.lsus.udop.visuals.*"
width="400" height="400" depth="1"
initialize="init()">
<fx:Script>
<![CDATA[
import flash.events.MouseEvent;
private var moving:Boolean = false;
private var relativeX:Number;
private var relativeY:Number;
private function selectWindow(event:MouseEvent):void {
// ********************
// THE PART IN QUESTION
// ********************
this.depth = event.target.parentApplication.obtainNewHigherDepth();
}
private function windowDragMouseDown(event:MouseEvent):void {
relativeX = event.stageX - this.x;
relativeY = event.stageY - this.y;
moving = true;
this.systemManager.addEventListener(MouseEvent.MOUSE_MOVE, windowDragMouseMove, true);
this.systemManager.addEventListener(MouseEvent.MOUSE_UP, windowDragMouseUp, true);
}
private function windowDragMouseMove(event:MouseEvent):void {
event.stopImmediatePropagation();
this.x = event.stageX - relativeX;
this.y = event.stageY - relativeY;
}
private function windowDragMouseUp(event:MouseEvent):void {
event.stopImmediatePropagation();
moving = false;
this.systemManager.removeEventListener(MouseEvent.MOUSE_MOVE, windowDragMouseMove, true);
this.systemManager.removeEventListener(MouseEvent.MOUSE_UP, windowDragMouseUp , true);
}
private function init():void {
this.addEventListener(MouseEvent.MOUSE_DOWN, selectWindow);
titleBar.addEventListener(MouseEvent.MOUSE_DOWN, windowDragMouseDown);
this.depth = this.parentApplication.obtainNewHigherDepth();
}
]]>
</fx:Script>
<s:Rect width="100%" height="100%">
<s:fill>
<s:SolidColor color="0x000000" />
</s:fill>
</s:Rect>
<s:Group id="titleBar" top="0" left="0" right="0" height="20">
<s:Label text="Title Bar Text" id="titleBarText" top="5" bottom="0" left="5" color="0xffffff" />
</s:Group>
<s:Group id="content" top="21" left="1" right="1" bottom="1" />
</s:Group>
<?xml version="1.0" encoding="utf-8"?>
<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
width="100%" height="100%"
initialize="init()">
<fx:Script>
<![CDATA[
import com.google.maps.Map;
import com.google.maps.MapEvent;
import com.google.maps.MapType;
import com.google.maps.controls.MapTypeControl;
private function onMapReady(event:MapEvent):void {
map.enableScrollWheelZoom();
map.addControl(new MapTypeControl());
}
private function init():void {
map.addEventListener(MapEvent.MAP_READY, onMapReady);
}
]]>
</fx:Script>
<maps:Map xmlns:maps="com.google.maps.*"
url="http://code.google.com/apis/maps/"
key="ABQIAAAAiVMBdjzjhpqA-qSxuuT0cRT2yXp_ZAY8_ufC3CFXhHIE1NvwkxQ4igt7gOyr4x11lp3ETKR2fOH5Hw"
sensor="false"
width="100%" height="100%" id="map" />
</s:Group>