![]() |
Отследить перерисовку объекта
Как отследить, что объект изменил свой внешний вид? Например, в текстовом поле новый текст появился (CHANGE не подходит, так как если поле невидимое, то визуально оно не поменялось, а CHANGE сработает). Или, например, мувиклип перешел в другой кадр, отличающийся от предыдущего. Нужен какой то эвент вроде onDraw, если есть такой.
Заранее спасибо |
Переопределите сеттер text у TextField. Или, вы же меняете текст его? Ну так вставьте после смены текста диспатч события.
|
мне надо отследить визуальные изменения у любых объектов, не только текстовых полей.
|
Ну и диспатчите события, кто мешает?
Сделайте свое событие с параметром - DrawEvent. В параметр передавайте ссылку на изменившийся объект, если не хотите заморачиваться. Только зачем это вам нужно? |
Цитата:
|
Объекты, за которыми надо следить, должны сами уведомлять о своем изменении. Они-то, надеюсь, знают что изменились?))
Про CHANGE забавно, ага. Ничто не мешает, получив это событие, узнать, отображается ли поле в данный момент. Для мувиклипа можно повесить следилку, которая будет проверять на ENTER_FRAME номер текущего кадра и сравнивать его с предыдущим. Но вообще это проблема архитектуры, как и всегда, когда вам кажется, что "Adobe о вас не позаботились"))) Думайте, как лучше организовать приложение. Ничто не происходит само по себе. Все можно отследить, если нужно. |
хорошо, какой эвэнт диспатчить, чтоб он подходил и для текстовых полей, и для мувиклипов и для всего остального, что только можно придумать.
Добавлено через 1 минуту Wolsh, Как отследить изменение текста, не переписывая класса ТекстФилд, если текст изменился из кода? |
Что Вы имеете в виду под "подходил"?
|
Цитата:
|
Я имею ввиду, что мне нужен некий эвент, который отслеживает внешние, визуальные изменения объектов
Добавлено через 44 секунды goodguy, CHANGE не срабатывает, если текстовое поле изменено из кода. я проверил |
Ивент ничего не отслеживает
|
Цитата:
|
Что значит не срабатывает? Кто мешает создать класс, расширяющий TextField, переопределить в нем сеттер text и доставлять событие после изменения текста
Код AS3:
|
Ну так сделайте свой CustomEvent.CHANGE, с параметром object:Object. Без переопределения сеттеров. Делов-то.
См. пост 4 |
Короче ответ - НЕТ, ДисплейОбжекты не диспатчат стандартных событий "мой_внешний_вид_изменился". По той причине, что такое отслеживание не нужно при правильной архитектуре (ибо это ваш код меняет их вид, соответственно вы всегда знаете, когда это происходит) и думаю, жрало бы немало ресурсов, учитывая специфику Флэш – динамически изменяемая, анимированная графика.
|
Задача заключается в том, чтобы отлавливать все изменяющие вид объекты. Места, из которых они изменяются, мне не доступны. Я пишу библиотеку, которая будет работать с разными проектами. С помощью AddedToStage я отлавливаю все добавленные на stage объекты и на них надо навесить этот чудо-эвент, который будет срабатывать при их визуальном изменении, записывая это в лог.
|
Советую для начала ознакомиться с понятием Событие и событийной моделью AS3, и конечно классом EventDispatcher. Выражение "навесить этот чудо-евент" говорит о том, что Вы пока неверно себе представляете эту модель.
|
Цитата:
|
Теоретически можно представить себе например набор декораторов, расширяющих все стандартные ДисплейОбжекты и переопределяющие для них все сеттеры, влияющие на внешний вид, с тем чтобы отправлять чудо-событие)) Не могу сходу представить себе способ создания такого декоратора для собственной графики объекта (то есть если изменение будет происходить через свойство graphics).
|
Event.RENDER - думаю это оно.
Bgg, Попробую, если RENDER не то. Спасибо Остальным тоже спасибо. |
Можно вообще извратиться, и сделать нечто подобное отслеживанию движения через веб камеру, с помощью BlendMode.DIFFERENCE определять изменившийся регион )
|
Если бы это было "оно", Вам бы уже давно сказали. Событие RENDER диспатчится, когда флэш-плеер собирается перерисовать картинку (стейдж). Не более того. Он просто предупреждает (тех кто подписался) - "сейчас буду перерисовывать, кто не спрятался – я не виноват!". Его используют для инвалидации. Например, у вас есть какой-то объект кастомного класса, у которого есть несколько сеттеров для параметров (возьмем здесь – параметров внешнего вида). Применение любого из этих сеттеров требует значительного пересчета и перераспределения внутренних объектов, и их перерисовки. Теперь представьте, что вы задаете подряд несколько изменений - новые width, height, и еще какие-то кастомные свойства, меняющие вложенные объекты. На каждый вызов сеттера происходит изменение и перерисовка. Сначала для width, потом для height, потом еще что-то. Все это требует уймы лишних действий. При инвалидации вы сохраняете полученные сеттерами значения в их storage-переменные, но НЕ производите пересчет, пока не плеер не скажет - "RENDER". Только получив это событие, вы обрабатываете все новые данные скопом. Например, рисуете прямоугольник фона СРАЗУ с новым width, новым height, alpha и color. А не перерисовываете его при изменении КАЖДОГО из этих свойств по-отдельности. В этом смысл получения стандартного события RENDER.
|
Небольшой стеб по теме.
И так, решение задачи. Каждый кадр записываем в битмапу содержимое stage-а, при наступлении следующего кадра - сверяем новую битмапу с предыдущей попиксельно. При отсутствии отличий - удаляем новую битмапу и ждем следующий кадр. При наличии отличий - определяем координаты, где были внесены изменения, по ним вычисляем все возможные объекты. У них сверяем координаты и размеры. Если все осталось на своих местах - поступаем аналогично как для stage. При наличии несоответствий - диспатчим событие. При таком раскладе ФП наверное и секунды не протянет )))) |
TanaTiX
Как быть если песочница не позволяет делать снимки с объекта? Отображается или нет можно проверить через переменную .stage объекта. |
Цитата:
|
TanaTiX, почти тот же стеб, что предложил я с бленд модом )
|
Цитата:
То есть вот вызывается сеттер width и в нем вызываются методы графикс, например drawRect, с этим новым width. Затем так же вызывается сеттер height и снова перерисовка в графиксе. Я вот не уверен, что в результате отрисовка изображения при смене "кадра" будет выполнена только один раз. Я думаю, будут выполнены все команды отрисовки в стеке. А ведь рисование это далеко не всегда один квадратик))) В сумме с возможно очень даже немалыми расчетами (в случае например тригонометрии - секторов, полярных координат и тп) такие лишние отрисовки дают немалую задержку. |
После clear(), мне представляется, можно чистить стек.
|
| Часовой пояс GMT +4, время: 23:52. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.