在AS3 API手册的DisplayObject类中,对localToGlobal方法的解析没有问题,但在实际运用中,我们的面对情形有点变化。我们先看手册中举的例子:
以下代码可创建一个 Sprite 对象。 该 Sprite 对象的 mouseX 和 mouseY 属性位于显示对象的坐标空间中。 此代码使用 localToGlobal() 方法将这些属性转换为全局(舞台)坐标:
如果是这种写法的话得出的全局坐标点是错的,为什么?因为,这相当于是求一个在son中的点(x:10,y:20)在全局位置的坐标,son在square中的本地坐标转为stage中的坐标应该是:
以下代码可创建一个 Sprite 对象。 该 Sprite 对象的 mouseX 和 mouseY 属性位于显示对象的坐标空间中。 此代码使用 localToGlobal() 方法将这些属性转换为全局(舞台)坐标:
import flash.display.Sprite; import flash.events.MouseEvent; import flash.geom.Point; var square:Sprite = new Sprite(); square.graphics.beginFill(0xFFCC00); square.graphics.drawRect(0, 0, 100, 100); square.x = 100; square.y = 200; addChild(square); square.addEventListener(MouseEvent.CLICK, traceCoordinates) function traceCoordinates(event:MouseEvent):void { var clickPoint:Point = new Point(square.mouseX, square.mouseY); trace("display object coordinates:", clickPoint); trace("stage coordinates:", square.localToGlobal(clickPoint)); }这里舞台只添加了一个对象--square,它求鼠标点击点在stage中的坐标。但我们经常处理的是错综复杂的子对象与孙对象,如果square再添加一个子对象sun,变成:
我想,import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.geom.Point;
var square:Sprite = new Sprite();
var son:Sprite = new Sprite();
square.graphics.beginFill(0xFFCC00);
square.graphics.drawRect(0, 0, 100, 100);
square.x = 100;
square.y = 200;
son.graphics.beginFill(0xFF6600);
son.graphics.drawCircle(5, 5, 50);
son.x = 10;
son.y = 20;
square.addChild(son);
addChild(square);
son.addEventListener(MouseEvent.CLICK, traceCoordinates)
function traceCoordinates(event:MouseEvent):void {
var clickPoint:Point = new Point(son.x, son.y);
trace("stage coordinates:", son.localToGlobal(clickPoint));
}
son.localToGlobal(clickPoint)是很多人的习惯写法,头脑中直接认为,求son在stage的坐标,包括我。
如果是这种写法的话得出的全局坐标点是错的,为什么?因为,这相当于是求一个在son中的点(x:10,y:20)在全局位置的坐标,son在square中的本地坐标转为stage中的坐标应该是:
square.localToGlobal(clickPoint);因为son的注册点(x:10,y:20)是相对于square的,即是应用的点坐标系是父对象的。在son添加到父对象后也可这样写:
应该再次记住的是,clickPoint是square或parent的坐标系,而非son的,但也并非说不能写成:parent.localToGlobal(clickPoint)
son.localToGlobal(clickPoint)而是,这个意思变了。