Высота отображаемого объекта AS3 сообщается неправильно

Это должно быть просто. Что мне не хватает? Создайте спрайт (контейнер), поместите его в список отображения, добавьте новый спрайт (прямоугольник) в контейнер. Изменение высоты ребенка (прямоугольник). Значения высоты как родительского (контейнер), так и дочернего (прямоугольный) отображаются неправильно, хотя отображаются правильно. Спасибо за вашу помощь.

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

person Gus    schedule 11.06.2015    source источник
comment
Вы говорите, что спрайт (прямоугольник) внутри спрайта (контейнера), но ваш пример показывает SWF внутри спрайта. Что есть в SWF? Это переопределяет свойства размера?   -  person Aaron Beall    schedule 11.06.2015
comment
SWF — это векторный рисунок прямоугольника с заливкой. Его высота 100 пикселей, ширина 4 пикселя. Я не знаю, как встроенный SWF влияет на свойства спрайтов. Спрайт отображается правильно, если его свойства изменены в AS3.   -  person Gus    schedule 11.06.2015
comment
встроенные swf встроены как двоичные файлы и по этой причине ведут себя немного по-другому. Если вы создадите его клон, то этот клон будет вести себя правильно.   -  person BotMaster    schedule 11.06.2015


Ответы (1)


Судя по всему, вашего container нет в списке отображения сцены. Если измеренный DisplayObject отсутствует в списке отображения (нигде), его размерные свойства не пересчитываются должным образом при изменении его собственного списка отображения. По-видимому, это сделано для того, чтобы ускорить процесс сборки сложного 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 объекта вне сцены может быть в отрицательном решение снова то же самое - поместить объект на сцену, получить ширину, удалить объект со сцены.

person Vesper    schedule 11.06.2015