Почему obj.getBounds (). Height дает большую высоту, чем obj.height?

Я новичок в Flash и ActionScript, но справляюсь неплохо. Одна вещь, которая постоянно мешает мне, - это свойства width и height DisplayObject(Container)s. Я, наконец, начинаю разбираться в них и узнал, что ширина и высота Sprite определяются исключительно их содержимым, например.

Я не понимаю следующего: у меня есть Sprite, к которому я добавляю кучу Button. Все кнопки имеют height 30 и y 0. Таким образом, я ожидаю, что height содержащего Sprite будет 30. Удивительно, но height равно 100.

В документации Adobe к свойству height объекта DisplayObject говорится:

Указывает высоту экранного объекта в пикселях. Высота рассчитывается на основе границ содержимого экранного объекта.

Видимо, важны «границы» объекта. Итак, я пошел дальше и написал этот небольшой тест в Sprite, который содержит Buttons:

for (var i:int = 0; i < numChildren; ++i)
{
    trace("Y: " + getChildAt(i).y + " H: " + getChildAt(i).height);
    trace("BOUNDS H: " + getChildAt(i).getBounds(this).height);
}
trace("SCALEY: " + scaleY + " TOTAL HEIGHT: " + height);

Этот код выполняет итерацию по всем объектам, добавленным в его список отображения, и показывает их значения y, height и getBounds().height. Удивительно, но на выходе получается:

Y: 0 H: 30
BOUNDS H: 100
... (5x) 
SCALEY: 1 TOTAL HEIGHT: 100

Это показывает, что границы кнопок на самом деле больше, чем их высота (и высота, которой они кажутся визуально). Однако я понятия не имею, почему это так. Итак, мои вопросы:

  • Почему границы моих кнопок больше их высоты?
  • Как я могу установить границы моих кнопок, чтобы мой Sprite не был больше, чем я ожидал, исходя из положения и размера содержащихся в нем объектов?

Кстати, кнопки создаются следующим образом:

var control:Button = new Button();
control.setSize(90, 30);
addChild(control);

person TC.    schedule 03.03.2010    source источник
comment
Я попытался воспроизвести это с помощью простых видеороликов, но не смог, поэтому я предполагаю, что класс Button переопределяет свойство get для 'height' и возвращает 'видимую высоту', но границы возвращают высоту, включая скрытые объекты (те, что с .visible = ложь)   -  person Les    schedule 03.03.2010
comment
Ага, это чушь - класс «Пуговица» как-то лажает.   -  person alecmce    schedule 06.03.2010


Ответы (2)


От Adobe:

Возвращает прямоугольник, определяющий область экранного объекта относительно системы координат объекта targetCoordinateSpace. Рассмотрим следующий код, который показывает, как возвращаемый прямоугольник может варьироваться в зависимости от параметра targetCoordinateSpace, который вы передаете методу:

 var container:Sprite = new Sprite();
 container.x = 100;
 container.y = 100;
 this.addChild(container);
 var contents:Shape = new Shape();
 contents.graphics.drawCircle(0,0,100);
 container.addChild(contents);
 trace(contents.getBounds(container));
  // (x=-100, y=-100, w=200, h=200)
 trace(contents.getBounds(this));
  // (x=0, y=0, w=200, h=200)

Примечание. Используйте методы localToGlobal () и globalToLocal () для преобразования локальных координат экранного объекта в отображаемые координаты или отображения координат в локальные координаты, соответственно.

Метод getBounds () аналогичен методу getRect (); однако Rectangle, возвращаемый методом getBounds (), включает любые штрихи на фигурах, тогда как Rectangle, возвращаемый методом getRect (), не включает. Пример см. В описании метода getRect ().


Насколько я понимаю, для кнопки по умолчанию установлено значение 100. Попробуйте увеличить высоту выше 100, но getbounds все равно вернет 100. Я предполагаю, что это какое-то значение по умолчанию, установленное для каждого элемента управления в частности.

Также, если вы хотите получить высоту, почему бы не вместо:

getChildAt(i).getBounds(this).height

Использовать :

getChildAt(i).height
person loxxy    schedule 13.12.2010
comment
Проблема в том, что у вас, вероятно, есть текстовое поле внутри. Текстовые поля имеют высоту 100, если не заданы вручную. Глупый саман. - person apscience; 15.09.2011

Кажется, вы отслеживаете масштаб объекта-контейнера, но вам должно быть больше интересно свойство getChildAt (i). scaleY (то есть масштабирование кнопки), которое, вероятно, составляет 30/100 ( 0,3).

Если сама кнопка не масштабируется (что маловероятно), то это может быть что-то происходящее с переопределением классом Button свойств шкалы и высоты для возврата значений, отличных от того, что вернет реализация его родительского класса.

person Triynko    schedule 19.05.2010