【问题标题】:In flex, how to get coordinates when using VBox for stacking up components?在flex中,使用VBox堆叠组件时如何获取坐标?
【发布时间】:2011-03-27 12:41:51
【问题描述】:

在 flex 中,我使用 VBox 和 HBox 来堆叠组件。当我尝试获取组件的 x,y 坐标时,我总是得到 0。如果我指定像 mx:VBox x="120" 这样的坐标,那么我会得到值。

如何在不明确说明的情况下获得坐标。

【问题讨论】:

  • 我不明白你想做什么或得到什么结果。你能分享一些代码吗?
  • mx:AddChild relativeTo="{mainBox}" mx:VBox id="box1" verticalGap="0" width="100%" mx:htmlText mx:Text> mx:VBox
  • 现在,如果我尝试获取 directonsHelp 的 y 坐标,我得到 0。我什至尝试了 localToGlobal 方法,但结果也是 0。我猜这可能与组件的堆叠方式有关?问题是:为什么我得到的值是 0 而不是正确的 y 坐标?
  • 所以问题是,如果组件相对堆叠,我们可以得到X坐标吗?
  • 将代码放在您的主要问题中,并对其进行格式化。看来您正在使用 Flex 3 状态处理类的“AddChild”类。你确定你进入了添加孩子的状态吗?

标签: apache-flex coordinates vbox


【解决方案1】:

您可以将坐标相对于舞台进行平移。查看下面的代码:

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 被子对象调用后,坐标才会被处理。

【讨论】:

    【解决方案2】:

    组件的 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>
    

    【讨论】:

    • 如果您在 VBox 中有一个组件,则该组件的 x 和 y 值将被忽略;并且很可能会被 VBox 布局逻辑重置。
    • 不是真的 afaik。将+", local coords are ("+directionsHelp.x+", "+directionsHelp.y+")";添加到我上面的directionsHelp.text赋值中,然后复制directionsHelpText控件上方的100x100框,输出会是:My stage coordinates are (0, 318), local (0, 106)所以Text控件的局部X和Y坐标已经被更新了VBox 布局逻辑。
    猜你喜欢
    • 1970-01-01
    • 2011-03-27
    • 1970-01-01
    • 1970-01-01
    • 2018-03-13
    • 1970-01-01
    • 2011-09-27
    • 2018-02-01
    • 2010-12-19
    相关资源
    最近更新 更多