![]() |
Как среда Flash определяет, какой событийный объект создать?
Во внешней среде (ОС) произошло воздействие на swf: мышкой поводили\щелкнули, кнопку на клавиатуре нажали, когда фокус на swf был, загрузка файла началась\закончилась и т.п. Как среда Flash понимает, какой событийный объект в каком случае создать? ОС передает соответствующее API?
|
Так же, как и браузер.
В целом да, как сказал - так и есть. |
Тогда следующий вопрос. Про свойства Event, для чего они нужны и почему их такая куча. Среда Flash получает событие от ОС со всеми возможными характеристиками события. Эти всевозможные характеристики пишутся как раз в эти свойства Event?
Добавлено через 1 минуту Цитата:
|
не понял, что вы хотите, но если интересуют события виндоус, можете воспользоваться программкой spy++ (поставляется вместе с Visual Studio). там можно посмотреть, что за события посылает windows всем окнам (включая и флеш, и браузер)
Цитата:
события нужны чтобы уменьшить связность между классами. например виндовсу абсолютно побарабану, что там должно произойти при клике мышкой. он просто формируем событие клика и передает их браузеру, тот флешу. флеш обрабатывает это событие, находит объект под координатами курсора, и заставляет этот объект сгенерировать событие |
Цитата:
Добавлено через 6 минут Но это все предопределенные события: какие характеристики (и события) разработчики дали программистам, теми они и могут пользоваться. При разработке ПО, взаимодействующего с аппаратурой, есть ограничения? Например, новый тип манипулятора или диагностическое оборудование? Это все можно повесить на стандартные события? |
это должен отрабатывать сам плеер. например не задействована там левая кнопка - события так и не присылаются ( вернее он перехватывает их и показывает меню, вместо того чтоб передавать событие дальше) Тоже самое про остальные события.. типа файл загружен, нажата кнопка сохранить в диалоговом окне сохранения файла.. итп.
|
Цитата:
При разработке ПО, взаимодействующего с нестандартной аппаратурой, лучше использовать не флэш, он не для этого. Можете посмотреть в сторону Qt. |
ok. Всем спасибо за помощь!
Добавлено через 7 минут Понял. Всем спасибо за помощь! Еще вопрос по предопределенным событиям. Среда создает только те событийные объекты, которые указаны в import или автоматически все возможные (имею ввиду предопределенные)? |
флеш получает все события, пришедшие от ОС. каждый DisplayObject генерирует события вне зависимости, есть подписчики или нет. события на то и события, что им абсолютно по барабану, подписаны на них мильен обработчиков или ни одного. они возникают в любом случае
|
Цитата:
Цитата:
|
Цитата:
|
Значит, событийные объекты создаются средой флеш. Ясно, меньше ошибок программиста. На каждое событие только один экземпляр событийного объекта?
|
|
Объект флэш-события создается, видимо, если есть хоть один его слушатель, иначе какой в нем смысл? На этапе компиляции в ролик встраивается код, позволяющий этих слушателей создавать. А импорты просто указывают, что это будет за код.
Цитата:
|
Цитата:
Цитата:
Добавлено через 34 секунды Цитата:
|
Цитата:
- склонировали объект события. - записали в него новые target, currentTarget, отдали слушателю. - если слушатель "остановил" событие, прекращаем его раздавать остальным слушателям. (В случае с всплывающими событиями, событие можно остановить отдельно, чтобы не всплывало дальше и отдельно, чтобы слушатели того же уровня его не получили). Да, но с другой стороны, если вам эта реализация кажется избыточной (мне иногда она кажется избыточной :) ) То никто не мешает переопределить методы типа dispatchEvent() и раздавать не клонированое событие, а один и тот же объект, ну или вообще забить на события и просто вызывать функцую слушателя, если в событиях как таковых нет необходимости. |
Хм.. ну, если мувиклип способен реагировать на нажатие мыши, а он способен, код этого класса как раз и создает слушателя нажатий мыши, только происходит это на автомате, хотите вы этого или нет, ибо такой класс. Среда ему эти события будет исправно предоставлять. В вашей терминологии "импорт события" это импорт класса, создающего слушателя данного события. А дальше - уже логика обработки. И тут уже неважно, есть ли слушатели этого события в последующей цепочке, то бишь подписался кто-то на событие клипа или не подписался.
|
Цитата:
Цитата:
|
флеш получит мышинное событие в любом случае. в сотый раз говорю: ему абсолютно плевать, слушает кто его или нет. и даспатчЕвент сработает. просто если подписчиков нет, то никуда это событие и не пойдет.
насчет import MouseEvent: это тоже ни на что не влияет. эта строчка нужна для того чтобы вы в коде могли использовать класс MouseEvent (к слову сказать, этот класс нативный (находится в самом плеере) зы: вчитываясь с комменты, создается такое впечатление, что каждый говорит о своем UPD: даже не пожалел времени набросал как примерно работает EventDispatcher (реализация может и не такая, но идея должна быть понятна) Код AS3:
|
Цитата:
Диспетчер (в том числе то, что вы называете "среда") рассылает события всем подписчикам, вне звависимости от того, произведён ли в их коде импорт соответствующего класса. А то, на какое событие слушатель подписан, определяется не классом события, а строкой, которая была передана в качестве параметра type метода addEventListener (и доступна через Event.type). Например, мы можем подписаться на MouseEvent.MOUSE_DOWN, а параметр метода-слушателя объявить как e:Event. И события будут приходить всё равно, более того, не возникнет никаких ошибок (так как MouseEvent наследует Event). Мы просто не сможем получить доступ к свойствам и методам, определённым непосредственно в MouseEvent (localX, например). |
Цитата:
|
Естественно, просто я именно хотел обратить внимание на то, в чём разница между типом и классом события.
|
Цитата:
Цитата:
Далее: - При возникновении однотипного события несколько раз, создается соответствующее количество объектов: например, щелкнул 3 раза - флеш создал 3 объекта события MouseEvent; - импорт предопределенных событий. Только для удобства записи в коде. Цитата:
|
Да, всё верно. Среда содержит в себе определённое количество нативных наследников EventDispatcher – диспетчеров событий. Эти события вручную создавать, как правило, нет необходимости, они создаются плеером.
Хотя никто вам этого делать не мешает: например, можно сгенерить в каком-нибудь DisplayObject-е событие MouseEvent.MOUSE_DOWN, и все подписчики будут думать, что в этом объекте был произведён щелчок мышью. |
Цитата:
Цитата:
Код AS3:
и при этом да - MouseEvent зашит в плеер. |
Цитата:
|
Не flash.display.MouseEvent, а flash.events.MouseEvent. Обратите внимание.
Добавлено через 4 минуты Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
P.S. почитайте этот топик. |
Цитата:
Цитата:
|
Получается, даже для нативного класса необходимо выполнить импорт. А нативность дает только то, что в коде можно не создавать объекты такого класса, это делает флеш?
з.ы. не считая скорости работы объектов нативных классов. |
Цитата:
|
С пользовательскими событиями вручную - флеш сам не создает их объекты?
Добавлено через 8 минут Или если свой класс-события - наследник от нативного Event, то флеш все равно сам создает событийные объекты? |
так разберемся:
чтобы сгенерировать событие нужно вызвать метод dispatcheEvent, куда передать наше событие. при клике флеш сам вызывает метод dispatcheEvent у необходимого объекта с необходимым событием. никто не мешает вам самому вызвать событие клика. для этого нужно просто создать экземпляр MouseEvent с типом "click". и вызвать метод dispatcheEvent |
Всем спасибо за прояснение некоторых нюансов. Оказалось, не до конца понимаю архитектуру событийной модели. Но это уже уже к теме не относится.
|
| Часовой пояс GMT +4, время: 11:30. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.