Почему obj.getBounds (). Height дает большую высоту, чем obj.height? - PullRequest
3 голосов
/ 03 марта 2010

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

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

Документация Adobe свойства height DisplayObject гласит:

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

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

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);

Ответы [ 2 ]

1 голос
/ 13 декабря 2010

от 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 ().


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

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

getChildAt(i).getBounds(this).height

Использование:

getChildAt(i).height
0 голосов
/ 19 мая 2010

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

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

...