Flex では、VBox と HBox を使用してコンポーネントをスタックしています。コンポーネントの x,y 座標を取得しようとすると、常に 0 になります。 mx:VBox x="120" のように座標を指定すると、値が取得されます。
明示的に指定せずに座標を取得するにはどうすればよいですか。
Flex では、VBox と HBox を使用してコンポーネントをスタックしています。コンポーネントの x,y 座標を取得しようとすると、常に 0 になります。 mx:VBox x="120" のように座標を指定すると、値が取得されます。
明示的に指定せずに座標を取得するにはどうすればよいですか。
座標をステージに対して相対的に変換できます。以下のコードをチェックしてください。
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
が子オブジェクトによって呼び出されるまで、座標は処理されないことに注意してください。
コンポーネントの 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>