在flex中,如何在使用VBox堆叠组件时获取坐标?

时间:2010-08-09 21:03:10

标签: flex coordinates vbox

在flex中,我正在使用VBox& HBox堆叠组件。当我尝试获取组件的x,y坐标时,我总是得到0.如果我指定cooridnate如mx:VBox x =“120”,那么我得到的值。

如何在没有明确说明坐标的情况下获取坐标。

2 个答案:

答案 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.xdirectionsHelp.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>