Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Архив Flasher.ru > Flash > Action script 2.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему  
Старый 05.06.2004, 11:24
dozen вне форума Посмотреть профиль Отправить личное сообщение для dozen Посетить домашнюю страницу dozen Найти все сообщения от dozen
  № 1  
dozen

Регистрация: May 2004
Адрес: Toronto, ON, Canada
Сообщений: 24
Question 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
http://dozen.ru

Старый 05.06.2004, 22:03
dozen вне форума Посмотреть профиль Отправить личное сообщение для dozen Посетить домашнюю страницу dozen Найти все сообщения от dozen
  № 2  
dozen

Регистрация: May 2004
Адрес: Toronto, ON, Canada
Сообщений: 24
стандратные компоненты ведут себя так же. следовательно -- фича. хотя и кривая.
__________________
dozen
http://dozen.ru

Старый 07.06.2004, 20:53
Diomas вне форума Посмотреть профиль Отправить личное сообщение для Diomas Найти все сообщения от Diomas
  № 3  
Diomas
 
Аватар для Diomas

Регистрация: Nov 2001
Адрес: spb.ru
Сообщений: 177
Только стандартные компоненты нормально ресайзятся.

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

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

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


Последний раз редактировалось Diomas; 07.06.2004 в 20:58.
Старый 09.06.2004, 05:59
dozen вне форума Посмотреть профиль Отправить личное сообщение для dozen Посетить домашнюю страницу dozen Найти все сообщения от dozen
  № 4  
dozen

Регистрация: May 2004
Адрес: Toronto, ON, Canada
Сообщений: 24
Да, стандартные ресайзятся нормально, а вращаются -- так же криво.

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

Старый 15.06.2004, 06:56
dozen вне форума Посмотреть профиль Отправить личное сообщение для dozen Посетить домашнюю страницу dozen Найти все сообщения от dozen
  № 5  
dozen

Регистрация: May 2004
Адрес: Toronto, ON, Canada
Сообщений: 24
Разобрался.

Есть два вида ресайза -- в 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
http://dozen.ru

Старый 15.06.2004, 06:58
dozen вне форума Посмотреть профиль Отправить личное сообщение для dozen Посетить домашнюю страницу dozen Найти все сообщения от dozen
  № 6  
dozen

Регистрация: May 2004
Адрес: Toronto, ON, Canada
Сообщений: 24
Цитата:
Оригинал написал(а) Diomas
Только мне не понятно, как этот UIObject реагирует на события на stage во время редактирования. Что надо сделать, чтобы ресайзить свои компоненты без наследования UIObject или UIComponent? [/b]
Нужно реализовать setSize(w,h).
Всё. Это захардкожено во Флэше.
__________________
dozen
http://dozen.ru

Создать новую тему   Часовой пояс GMT +4, время: 03:12.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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