在flex中,我正在使用VBox& HBox堆叠组件。当我尝试获取组件的x,y坐标时,我总是得到0.如果我指定cooridnate如mx:VBox x =“120”,那么我得到的值。
如何在没有明确说明坐标的情况下获取坐标。
答案 0 :(得分:2)
您可以将坐标相对转换为舞台。看看下面的代码:
var box:VBox = new VBox;
var child:DisplayObject = new DisplayObject;
box.addChild(child);
child.addEventListener(FlexEvent.UPDATE_COMPLETE, updateCompleteHandler);
...
private function updateCompleteHandler(fe:FlexEvent):void{
// find global coordinates
var globalCoords:Point = child.localToGlobal(new Point(0,0));
// coordsInBox is what you are looking for
var coordsInBox:Point = box.globalToLocal(globalCoords);
}
关键是对子组件使用localToGlobal
,然后globalToLocal
转换全局坐标,以便它们相对于盒容器表示。
请注意,在子对象调用UPDATE_COMPLETE
之前,不会处理坐标。
答案 1 :(得分:0)
组件的X和Y值始终相对于组件的父级。 directionsHelp.x
和directionsHelp.y
都将返回相对于包含它们的VBox的位置,除非您明确设置值或在其周围插入其他组件,否则默认为0。
关于localToGlobal()
要记住的事情是你必须从孩子那里召唤它。如果你有一个Application
并且只是调用localToGlobal( new Point(child.x, child.y) )
,它将尝试返回应用程序中相对于阶段的给定点(因为你没有指定“本地”是什么),这将是因此不进行转换,因此它将保持等于(0,0)。
如果你调用child.localToGlobal( new Point(child.x, child.y) )
,它将返回孩子相对于舞台的位置值,将孩子在舞台上的偏移量转换为给定点。
这是一个快速的应用程序来演示:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" backgroundColor="#FFFFFF">
<mx:Script>
<![CDATA[
private function updateCoords():void
{
var point:Point = new Point(directionsHelp.x, directionsHelp.y);
point = directionsHelp.localToGlobal(point);
directionsHelp.text = "My stage coordinates are ("+point.x+", "+point.y+")";
}
]]>
</mx:Script>
<mx:VBox>
<mx:Box height="100" width="100" borderStyle="solid" borderColor="#000000"
horizontalAlign="center" verticalAlign="middle">
<mx:Label text="100 x 100" />
</mx:Box>
<mx:VBox>
<mx:Text id="directionsHelp" color="#4FA4CD" fontSize="8" fontWeight="bold"
text="Click the button to display my position on the stage." />
<mx:Button label="Get Position" click="updateCoords()" />
</mx:VBox>
</mx:VBox>
</mx:Application>