|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Регистрация: Dec 2009
Сообщений: 25
|
изменение одновременно ширины и высоты спрайта
Доброго времени суток!
У меня возник такой вопросик, можно ли как-нибудь изменить размеры DisplayObject-а одной функцией? что-то типа sprite.setRect(0,0,100,100); просто когда на сцене расположен большой составной объект, то если менять сначала width, а затем height, то после смены каждого их этих значений генерируется отдельный ResizeEvent и картинка ресайзится дергано и некрасиво: сначала вытягивается в ширину, а уже потом выравнивает высоту. Или может можно как-то временно запретить объекту герерировать ResizeEvent? |
|
|||||
Регистрация: Dec 2010
Адрес: Ярославль
Сообщений: 1,255
|
Цитата:
|
|
|||||
Негуру
администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,879
Записей в блоге: 7
|
Цитата:
package ru.inils.display.invalidate { /** * @author iNils * @version 1.0 * * Абстрактный класс для реализации в визуальных классах однократного вычисления необходимых перерисовок графического содержимого в течении кадра. * Каждый вызов свойства или метода способного изменить графическое содержимое, занимает процессорное время. Использую функционал класса AInvalidate, вызов метода (redraw), ответственного за расчеты и перерисовку графического содержимого, происходит единожды. * * Изменения: * 1.0 (25.11.2008 18:59) * [+] ... */ /* IMPORT *///{ / import flash.display.*; import flash.events.*; //} public class AInvalidate extends Sprite { /* - VAR PRIVATE *///{ / /// Состояние объекта. private var _changed:Boolean = false; //} /* - CONSTRUCTOR - *///{ / public function AInvalidate () { addEventListener (Event.ADDED_TO_STAGE, onAddedToStage); addEventListener (Event.REMOVED_FROM_STAGE, onRemovedFromStage); changed = true; } //} /* # METHOD PROTECTED *///{ / /** * Заглушка для метода перерисовывающего графичское содержимое визуального класса, описываемого в расширяющихся классах. */ protected function redraw ():void { } //} /* EVENT *///{ / /// Событие добавления объекта на сцену private function onAddedToStage (event:Event):void { stage.addEventListener (Event.RENDER, onRenderListener); if (changed) { stage.invalidate (); } } /// private function onRemovedFromStage (event:Event):void { stage.removeEventListener (Event.RENDER, onRenderListener); } /// private function onRenderListener (event:Event):void { if (_changed) { _changed = false; redraw (); } } //} /* GETTER / SETTER *///{ / /** * Функция чтения сообщает о том, что содержит ли объект изменения, которые еще не были визуализированы. Функция записи устанавливает статус измений: true - помечает, что в объекте произошли визуальные изменения. false - помечает, что самые последние изменения были отображены на экране. */ final protected function get changed ():Boolean { return _changed; } final protected function set changed (value:Boolean):void { if (value == _changed) { return; } _changed = value; if (stage != null) { stage.invalidate (); } } //} } } Также переопределяете метод redraw, где и проводите все манипуляции с размерами и координатами. В результате, сколько бы раз вы не меняли x, y, width, height, вся отрисовка будет происходить только один раз. Примерно так package ru.inils.display.invalidate { /** * @author iNils * @version 1.0 * * Класс... * * Изменения: * 1.0 (06.12.2012 18:14) * [+] ... */ /* IMPORT *///{ / import flash.display.*; import flash.events.*; //} public class Sample extends AInvalidate { /* - VAR PRIVATE *///{ / private var _height:Number = 0; private var _width:Number = 0; //} /* * CONSTRUCTOR * *///{ / public function Sample () { } //} /* # METHOD PROTECTED *///{ / override protected function redraw ():void { trace ("Я изменился! " + _width + " " + _heigth); } //} /* GETTER / SETTER *///{ / public function get height ():Number { return _height; } public function set height (value:Number):void { if (value == _height) { return; } _height = value; changed = true; } public function get width ():Number { return _width; } public function set width (value:Number):void { if (value == _width) { return; } _width = value; changed = true; } //} } } То увидите надпись "Я изменился! 200 300" один раз, а не 4. Последний раз редактировалось iNils; 06.12.2012 в 19:42. |
|
|||||
блогер
Регистрация: Jun 2005
Адрес: Господи пожалуйста не Новосибирск
Сообщений: 6,598
Записей в блоге: 17
|
Это опечатка или новая конструкция?
И мне не совсем понятно как это работает. В момент RENDER можно менять сколько-угодно свойств у объекта, и они точно перерисуются без ресайз-эвента и перед текущим фреймом? Насколько я помню, во флеше не наступит рендер кадра до того, как выполнится скрипт. Как может произойти дёрганный ресайз, если в один момент происходит смена width/height? Инвалидтор, бесспорно, даст прирост в скорости, если менять одинаковые визуальные свойства много раз за кадр, но как он поможет в этом случае?
__________________
Тут мужик танцует и поёт про флэш Последний раз редактировалось Psycho Tiger; 06.12.2012 в 19:52. |
|
|||||
Регистрация: Dec 2009
Сообщений: 25
|
варианты с наследованием мне не очень-то подходят, т.к. в основном мне это нужно чтобы изменять размеры Flex-овых объектов (хотя уже не раз у меня возникала необходимость вносить изменения и во флексовые классы).
|
|
|||||
блогер
Регистрация: Jun 2005
Адрес: Господи пожалуйста не Новосибирск
Сообщений: 6,598
Записей в блоге: 17
|
Можно сделать композицией. Судь инвалидации – копить нужные свойства в полях/переменных, а потом выставить их за раз прямо перед показом фрейма - по Event.RENDER. Только я вот не совсем понимаю, к чему она тут (см. пост выше).
__________________
Тут мужик танцует и поёт про флэш |
|
|||||
...
модератор форума
Регистрация: Sep 2006
Адрес: Minsk
Сообщений: 4,286
|
Цитата:
Нилс, а почему RENDER, а не ENTER_FRAME? |
|
|||||
iNils, кстати говоря, немного считаю ваш класс неполным, в одной теме на stackoverflow, читал что существуют проблемы с RENDER событием, так как оно периодически не срабатывает, поэтому предлагается завязываться ко всему прочему на ENTER_FRAME, я для этих целей имею вот такую реализацию кастомного спрайта
Хотя возможно проблема с событием RENDER уже не актуальна |
|
|||||
Цитата:
__________________
http://www.chessmax.ru |
Часовой пояс GMT +4, время: 02:13. |
|
« Предыдущая тема | Следующая тема » |
|
|