Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Action script 2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=49)
-   -   MX 2004 Components: draw()/size() methods (http://www.flasher.ru/forum/showthread.php?t=59028)

dozen 05.06.2004 11:24

MX 2004 Components: draw()/size() methods
 
Я в непонятках. Есть небольшой компонент, который в draw()
рисует себя (moveTo,lineTo). И был он фиксированного размера
90x90. Решил научить его рационально использовать площадь --
если его заресайзили, то рисоваться по всей новой площади.

Начал с того, что в draw() получаю _width (или width -- всё равно),
и рисую. OK. Теперь кидаю получившийся компонента на новый документ,
и пробую его поресейзить, повращать и поискажать. Результат --
убийственный.

1. Простой ресайз не имеет на него никакого влияния. Рамка растет,
а он сам -- не рисует себя в большем размере.

2. Поворот и искажение изображаются при редактирование правильно,
то есть изображение поворачивается на нужный угол либо искажается
согласно пропорциям рамки, но вот при проигрывании по
Ctrl-Enter... размер компонента становится гораздо больше
желаемого. А именно -- сторона рисованного квадрата становится
равной стороне охватывающего прямоугольника: повернул квадрат
90х90 на 45 градусов, получил охватывающий квадрат с размером
в примерно 127 пикселов. И вот эти 127 и попадают в _width,
хотя там должно быть по-прежнему 90!

3. Особенное неудовольствие моё вызывает тот факт, что, при
редактировние on stage трассировка показывает вызовы size(),
при исполнении же по Ctrl-Enter вызов отсутствует.

Вот, собственно. Как мне победить ресайз/вращение?

P.S. MX 2004 7.0.1

dozen 05.06.2004 22:03

стандратные компоненты ведут себя так же. следовательно -- фича. хотя и кривая.

Diomas 07.06.2004 20:53

Только стандартные компоненты нормально ресайзятся.

Насколько я понял по макромедийным статьям:
draw() используется для прорисовки всех подобъектов компонента, без учета его размера.
size() используетя для перерисовки компонента в соответствии с его новыми размерами, а новые размеры определяются в параметрах setSize().

Т.е. когда ты тискаешь свой компонент на стейдже во время редактирования ему постоянно шлется setSize(newWidht, newHeight), внутри обработчика которого должен стоять вызов size().

Только мне не понятно, как этот UIObject реагирует на события на stage во время редактирования. Что надо сделать, чтобы ресайзить свои компоненты без наследования UIObject или UIComponent?

dozen 09.06.2004 05:59

Да, стандартные ресайзятся нормально, а вращаются -- так же криво.

size() зовется из setSize автоматом, если унаследовался от UIComponent... только вот что толку от такого метода, если он фигню сообщает?..

dozen 15.06.2004 06:56

Разобрался.

Есть два вида ресайза -- в authoring time и в runtime. И рулятся эти ресайзы по-разному.

В authoring time Flash дергает метод setSize(w,h). Тот в стандартных компонентах запоминает размеры в __width и __height (именно так, с двумя подчеркиваниям) и сразу дергает size(). Эти же проперти возвращаются через width/height.

А вот в runtime никаких вызовов setSize() нет. Нет даже вызовов size(). Сразу идет draw(). И вот в draw надо брать значение ширины и высоты из width и height.

Таким образом, надо реализовать два метода -- size() и draw().

В size() брать значение ширины и высоты из width и height (а не _width и _height!), и ресайзить деток (если компонент -- дернуть у него setSize(), если мувик -- просто выставить _width/_height).

В draw рисовать себя.

Поскольку в runtime size не зовется (сразу), то из draw имеет смысл дернуть процедуру коррекции размера. Примерно так:

Код:

  private function size(Void):Void
  {
    super.size();
    resize(width,height);
    invalidate();
  }

  function resize(w:Number,h:Number):Void
  {
    this._bg._width = w;
    this._bg._height = h;
    this._arrow._width = w/2;
    this._arrow._height = h/2;
    this._arrow._x = w/2;
    this._arrow._y = h/2;
  }

  function draw():Void
  {
    resize();
    ...


dozen 15.06.2004 06:58

Цитата:

Оригинал написал(а) Diomas
Только мне не понятно, как этот UIObject реагирует на события на stage во время редактирования. Что надо сделать, чтобы ресайзить свои компоненты без наследования UIObject или UIComponent? [/b]
Нужно реализовать setSize(w,h).
Всё. Это захардкожено во Флэше.


Часовой пояс GMT +4, время: 08:10.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.