未正确报告AS3显示对象高度

时间:2015-06-11 04:30:28

标签: actionscript-3 displayobject

这应该很简单。我错过了什么? 创建一个Sprite(容器),将它放在displaylist上,向容器中添加一个新的Sprite(rect)。 改变孩子的身高(直肠)。 虽然正确呈现,但父(容器)和子(rect)的高度值未正确报告。 谢谢你的帮助。

var container:Sprite = new Sprite();
addChild(container);

[Embed(source = "../lib/rectangle.swf")] // height is 100
var Rect:Class;
var rect:Sprite = new Rect();

trace(rect.height); // 100 is correct before placement in container
container.addChild(rect);
trace(rect.height); // 100 is correct after placement in container
trace(container.height); // 0 is not correct; should be 100

rect.height = rect.height + 100; // renders correctly at new height
trace(rect.height); // 100 is not correct; should be 200
trace(container.height); // 0 is not correct; should be 200

1 个答案:

答案 0 :(得分:0)

显然您的container不在舞台显示列表中。如果测量的DisplayObject不在显示列表(任何位置)上,则在更改其自己的显示列表时,不会正确重新计算其维度属性。这显然是为了节省Flash引擎更快地处理复杂MovieClip框架或任何其他复杂容器的构建的时间,并且只有在将容器放置到舞台上时才进行重新计算。解决方案是将要测量的对象放置在舞台上(任何地方,无论如何),收集其属性然后将其从舞台上移除。一个例子:

trace(this.stage); // [object Stage] - to make sure we can access stage in here
var sp:Sprite=new Sprite();
var b:Bitmap=new Bitmap(new BitmapData(100,100)); 
trace(sp.width); // should return 0
trace(sp.height); // 0 also
sp.addChild(b);
trace(sp.height); // 0 again
trace(b.height); // should return 100, as the bitmap data is specified
// as well as in your case, the class's width and height are precalculated
addChild(sp);
trace(sp.height); // returns 100, as expected
removeChild(sp);
trace(sp.height); // 100, stored
sp.removeChild(b);
trace(sp.height); // should also return 100, while there's no content in the sprite

还有另一种可能性,舞台上的对象的width可以是in the negative,解决方案也是一样的 - 把对象放在舞台上,获取宽度,从舞台上移除对象。