在Flex 4舞台上绘制API?

时间:2010-10-11 21:38:41

标签: actionscript-3 flex4

我目前正在尝试调试Flex 4中的问题,其中组件触发自定义事件,其本地坐标转换为全局坐标(即localToGlobal)和另一个组件(在显示器的单独“分支”中) list hierarchy)通过globalToLocal接收此类事件并将其用作动画的一部分。它应该是一个简单的坐标转换系统,但它不起作用。

我正在尝试调试这个,通过使用AS3的绘图API绘制Points应该是的圆圈。

以下是调度组件(下图中的组件A):

// Check where is the local x,y
this.graphics.beginFill(0x0000FF);
this.graphics.drawCircle(this.x,this.y, 10);

// Draw another circle in the "global" coordinates.
// pGC = Point in Global Coordinates.
var p: Point = new Point ( this.x, this.y);
var pGC:Point = Application(FlexGlobals.topLevelApplication).globalToLocal(p);
Application(FlexGlobals.topLevelApplication).graphics.beginFill( 0xFF0000)
Application(FlexGlobals.topLevelApplication).graphics.drawCircle(pGC.x,pGC.y,50);

// Dispatch the event
dispatchEvent( new ComponentLocationEvent( this.localToGlobal(this.x,this.y) );

以下是“监听”组件(下图中的组件B):

private var value_x:int;
private var value_y:int;

private function onComponentLocationData( pointInGlobalCoordinates:Point):void
{
  var pointLocalCoord:Point = this.childContainer.globalToContent( 
          pointInGlobalCoordinates);
  this.value_x = pointLocalCoord.x;
  this.value_y = pointLocalCoord.y;

  // More debugging circles
  this.graphics.beginFill(0x00FF00, 0.5);
  this.graphics.drawCircle(pointLocalCoord.x,pointLocalCoord.y);
}

可以预期三个圆圈(红色,绿色和蓝色)对应,每个圆圈在事件发送之前绘制,而一个(绿色)在事件侦听时绘制。实际发生的是:

  • 绘制蓝色圆圈的位置。
  • 永远不会绘制红色圆圈(因此,我在Flex 4中绘制舞台的问题)
  • 绿色圆圈是在一个意想不到的地方画的。

有没有人知道我可以在这里尝试什么?这是我调试此错误的方法,请随时指出我做错了什么。

编辑:这是一张图片,解释了组件之间的关系以及绘制点的位置: alt text

1 个答案:

答案 0 :(得分:0)

首先, 你觉得蓝色圆圈是在预期的地方绘制的吗?

我假设您的第一部分代码是ComponentA的代码。

this.x和this.y是相对于它的父级的控件坐标。

在绘制组件的本地图形对象时,设置蓝色圆圈应该是其他位置,但不应位于组件的左上角。 我已经创建了自定义组件并对其进行了测试。 你可以自己尝试一下。圆形在组件中的位置取决于组件容器内的组件位置。

package components
{
    import mx.controls.Button;
    public class ComponentA extends Button
    {
        public function ComponentA()
        {
            super();
        }

        override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
        {
            super.updateDisplayList(unscaledWidth, unscaledHeight);
            this.graphics.beginFill(0x0000FF);
            this.graphics.drawCircle(this.x,this.y, 10);
        }
    }
}

其次, var pGC:Point = Application(FlexGlobals.topLevelApplication).globalToLocal(p); 应该对翻译坐标没有影响(我没有测试它,但它应该是这样) 否则,如果不是应用程序级别坐标,那么全局坐标是什么......

在监听器代码中,您使用的是用于转换坐标的childContainer是什么?