![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
|
|||||
|
Регистрация: May 2004
Адрес: Toronto, ON, Canada
Сообщений: 24
|
Я в непонятках. Есть небольшой компонент, который в 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 |
|
|||||
|
Регистрация: May 2004
Адрес: Toronto, ON, Canada
Сообщений: 24
|
стандратные компоненты ведут себя так же. следовательно -- фича. хотя и кривая.
__________________
dozen http://dozen.ru |
|
|||||
|
Регистрация: Nov 2001
Адрес: spb.ru
Сообщений: 177
|
Только стандартные компоненты нормально ресайзятся.
Насколько я понял по макромедийным статьям: draw() используется для прорисовки всех подобъектов компонента, без учета его размера. size() используетя для перерисовки компонента в соответствии с его новыми размерами, а новые размеры определяются в параметрах setSize(). Т.е. когда ты тискаешь свой компонент на стейдже во время редактирования ему постоянно шлется setSize(newWidht, newHeight), внутри обработчика которого должен стоять вызов size(). Только мне не понятно, как этот UIObject реагирует на события на stage во время редактирования. Что надо сделать, чтобы ресайзить свои компоненты без наследования UIObject или UIComponent? Последний раз редактировалось Diomas; 07.06.2004 в 20:58. |
|
|||||
|
Регистрация: May 2004
Адрес: Toronto, ON, Canada
Сообщений: 24
|
Да, стандартные ресайзятся нормально, а вращаются -- так же криво.
size() зовется из setSize автоматом, если унаследовался от UIComponent... только вот что толку от такого метода, если он фигню сообщает?..
__________________
dozen http://dozen.ru |
|
|||||
|
Регистрация: 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 |
|
|||||
|
Регистрация: May 2004
Адрес: Toronto, ON, Canada
Сообщений: 24
|
Цитата:
Всё. Это захардкожено во Флэше.
__________________
dozen http://dozen.ru |
![]() |
Часовой пояс GMT +4, время: 03:12. |
|
|
« Предыдущая тема | Следующая тема » |
|
|