removeChild之后动作怪坐标为所谓的
-
22-09-2019 - |
题
谁能帮助我做出以下的感觉?
我创建几个平方精灵然后删除第一个 并显示COORDS。 其结果是:
(x=0, y=0, w=208, h=40) 0 208
(x=42, y=0, w=166, h=40) 0 166
的x坐标仍为0,虽然宽度发生了变化, 的getBounds显示正确的值。 我希望X来改变。 因为X,globalToLocal和localToGlobal工作的错误的值不正确的。
如果你点击某处第二左侧(仍然可见)矩形 您可以:
2 28 (x=2, y=28)
这是良好的什么。括号中的值应在阶段COORDS并且它们不是
代码:
public function test():void {
var s:Sprite;
var i:int;
var arr:Array = new Array();
for (i = 0; i < 5; ++i)
{
s = new Sprite();
s.graphics.beginFill(0x999);
s.graphics.drawRect(0, 0, 40, 40);
s.graphics.endFill();
s.x = i * 42;
arr.push(s);
addChild(s);
}
trace(this.getBounds(stage), x, width);
removeChild(arr[0]); arr[0] = null;
trace(this.getBounds(stage), x, width);
addEventListener(MouseEvent.CLICK, click);
}
private function click(e:MouseEvent):void {
trace(e.localX, e.localY, localToGlobal(new Point(e.localX, e.localY)));
}
解决方案
你困惑在两个不同的点,但我认为他们从如何闪存涉及的坐标系统不完整的视图中的每个干。回想一下,所有的显示对象随身携带自己的坐标系。在你的第一个问题,一个对象的“X”和“Y”属性没有动态计算,以反映对象的左上角,他们只是表示该对象的原点的位置,相对于它的父级的坐标系。所以,只是因为对象的内容改变对象的“X”值不会改变 - 当你移动它改变物体本身
与舞台坐标的问题是,从范围localToGlobal
方法坐标转换中,它被称为 - 你是从矩形的父母打电话,但你在坐标通过从内部本地系统长方形。凝视,继针对位和它应该意义:
function click(e:MouseEvent):void {
// bad - uses rectangle coords in scope of "this"
//trace(e.localX, e.localY, localToGlobal(new Point(e.localX, e.localY)));
// works - call localToGlobal from the scope of the rectangle
trace( e.target.localToGlobal(new Point(e.localX, e.localY)));
// alternately, call it from any scope with coordinates taken from that scope:
trace( localToGlobal( new Point( mouseX, mouseY )));
trace( e.target.localToGlobal( new Point( e.target.mouseX, e.target.mouseY )));
}
<强>更新强>
是什么使这个混淆的部分是事件冒泡在AS3中是如何工作的。阅读的第几段这个优秀的文章得到的总体思路,然后明白,在这个例子中,事件最初由一个矩形发出的(因为这是得到了点击的图形),但只赶上他们,因为他们通过泡在那里你设置你的听众范围。所以e.target
是矩形,e.currentTarget
是你的听众范围。然后拼图的最后一块是了解e.localX
和e.localY
始终是事件的原始目标的坐标系统相同。 (这是因为它们是该事件的性质,并且它是没有意义为他们不断变化作为冒泡显示列表中的事件。)
最后一点,如果你想知道如何初学者通常这个东西应付,得到的答复是,人们通常直接连接监听到具有被点击的图形内容的显示对象。在这种情况下,e.target和e.currentTarget将永远是相同的,并且大多数初学者不需要了解所有的这一点。