![]() |
|
||||||||||
|
|||||
|
Регистрация: Jan 2010
Сообщений: 147
|
Господа, опасаюсь, что затронул тему, на которую мне никто ничего не напишет, кроме как читай книги и т.д. Я хотел бы понять на примере какой-то схемы или абстракции как работает ивентная модель во Flash. Как взаимодействуют диспатчер с листнером, контроллером? Может кто-то решиться на пальцах объяснить или стрелочками показать как это устроено внутри...
|
|
|||||
|
strange mood
|
http://help.adobe.com/en_US/ActionSc...0204-7e4f.html вот вам со стрелочками
![]()
__________________
тонкий тролль, осеянный благодатью |
|
|||||
|
Потратил два часа жизни, получился вот такой примерчик
main.rar Класс Main package { import components.CreateWindow; import events.CommonEvent; import flash.display.Sprite; import flash.events.* import flash.text.* public class Main extends Sprite { public var createWindow:CreateWindow; public function Main(){ init() } private function init():void { createWindow = new CreateWindow() addChild(createWindow) //получаем события из CreateWindow createWindow.addEventListener(CommonEvent.DRAG_WINDOW_DOWN, WinDragStart); createWindow.addEventListener(CommonEvent.DRAG_WINDOW_UP, WinDragStop); createWindow.addEventListener(CommonEvent.WINDOW_REMOVE, RemoveWindow); } private function WinDragStart(e:CommonEvent):void{ trace("Drag_Start") var val:uint = e.t e.target.startDrag() e.target.alpha = Number("0."+val) } private function WinDragStop(e:CommonEvent):void{ trace("Drag_Stop") var val:uint = e.t e.target.stopDrag() e.target.alpha = Number(val) } private function RemoveWindow(e:CommonEvent):void{ trace("Remove") removeChild(createWindow); } } } package components { import events.CommonEvent; import flash.display.Sprite; import flash.display.Shape; import flash.events.* public class CreateWindow extends Sprite { private var container:Sprite; private var line:Shape; private var line2:Shape; private var closeWindow:CloseWindow; public function CreateWindow(){ closeWindow = new CloseWindow() line = new Shape() line.graphics.lineStyle(2,0xFFFFFF) line.graphics.lineTo(10, 10); line.x = 85 line.y = 5 ////////////line2 line2 = new Shape() line2.graphics.lineStyle(2,0xFFFFFF) line2.graphics.lineTo(10, 10); line2.rotation = 90 line2.x = 95 line2.y = 5 container = new Sprite() container.graphics.beginFill(0xCCFF00); container.graphics.drawRect(0, 0, 100, 100); container.graphics.endFill() container.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler); container.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler); closeWindow.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownRemove); addChild(container) addChild(closeWindow) addChild(line) addChild(line2) } private function mouseDownHandler(e:MouseEvent):void{ //диспатчим в main dispatchEvent(new CommonEvent(CommonEvent.DRAG_WINDOW_DOWN, /*параметр прозрачности окна*/5)); } private function mouseUpHandler(e:MouseEvent):void{ //диспатчим в main dispatchEvent(new CommonEvent(CommonEvent.DRAG_WINDOW_UP, /*параметр прозрачности окна*/1)); } private function mouseDownRemove(e:MouseEvent):void{ //диспатчим в main dispatchEvent(new CommonEvent(CommonEvent.WINDOW_REMOVE, 0)); } } } Класс CloseWindow в пакете components package components { import flash.display.Sprite; import flash.display.Shape; public class CloseWindow extends Sprite { private var container:Shape; public function CloseWindow(){ container = new Shape() container.graphics.beginFill(0x000000); container.graphics.drawRect(80, 0, 20, 20); container.graphics.endFill() addChild(container) } } } package events{ import flash.events.Event; public class CommonEvent extends Event{ private var _t:uint; //храним имена всех событий public static const DRAG_WINDOW_DOWN:String = "drag_window_down"; public static const DRAG_WINDOW_UP:String = "drag_window_up"; public static const WINDOW_REMOVE:String = "window_remove"; public function CommonEvent(type:String, /*bubbles:Boolean = false, cancelable:Boolean = false,*/ val:uint) { super(type, /*bubbles, cancelable,*/ true, false); //параметр прозрачности окна _t = val; } public function get t():uint { return _t; } } } Исходник принципиально не выложил, попробуйте сперва сами разобраться ![]() Что не ясно спрашивайте. |
|
|||||
|
буду краток
модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
|
KiL33 :это в ту тему?
на русском: http://help.adobe.com/ru_RU/ActionSc...0204-7e4f.html а вообще в начале освоения AS3 меня жутко смущали наименования target и currentTarget - никак не мог понять почему это "цель" и " текущая цель". по нормальной логике целью является объект хранящий листенеры или сам листенер. По нормальной логике именования объект являющийся инициатором события должен называться sender (в AS3==target) - объект от которого получено событие currentSender (currentTarget) Может быть адобовцы не захотели чтобы их сравнивали с C# итп. может еще что.. я конечно уже всё давно понял и привык, но для новичков бывает сложновато въехать.. Цитата:
Какая цель может быть у события? У события как абстрактного объекта может быть только инициатор (sender) и может быть еще корреспондент вещающий события (currentSender) , который часто и есть инициатор, и отличается от него только в случае всплывающих событий. всё.. слушатель(listener) - вот это по сути цель события, но само событие к ним не привязано. слушатель только слушает у корреспондентов события определённого типа. и принимает их в качестве параметра.
__________________
Отряд Котовскага Последний раз редактировалось Котяра; 12.03.2010 в 11:06. |
|
|||||
|
Cтрелочки, конечно, хорошо, но в коде-то оно нагляднее
![]() |
|
|||||
|
listener
|
Насколько я понял, в документе http://help.adobe.com/ru_RU/ActionSc...0204-7e4f.html речь идет о том, как рассылает события рантайм плеера (сам плеер). Тогда все довольно логично: рантайм ловит, допустим, клик, порождает эвент-объект и ставит его в очередь на прокачку от стейджа до целевого узла (чилда) и обратно. Сам целевой узел определяется рантаймом в момент щелчка. Энтерфрейм шлется на прямую. В этом смысле все понятно. target, currentTarget - вполне оправдано употребляются в этом контексте. Почему не все шлется на прямую, а прокачивается очередь - тоже понятно, так проще ловить события в одной веток иерархии отображения. Если целевой объект не входит в иерархию отображения, то ивент шлется ему напрямую, (пример - сокет), что тоже логично.
Если мы добавили листенера на клик по целевому узлу, то вместе с целевым узлом, клик получит и листенер. Это логично делать, если листенер сидит в другой ветке иерархии отображаемых объектов или ниже/на том же уровне в той же ветке. Либо если целевой объект не входит в иерархию отображения вообще. Или я что-то попутал? Пользовательские события порождаются не рантаймом, а кодом, вот тут, пожалуй о целевом объекте речь идти не может. Пользовательский эвент рассылается по списку листенеров, добавленных к объекту-источнику, в очередь прокачки такой эвент совать ни к чему. Или я опять чего-то попутал? Последний раз редактировалось alexcon314; 12.03.2010 в 16:28. |
|
|||||
|
буду краток
модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
|
Может быть в механизме реализации событий это и понятно, но по большому счёту пользователю должно быть наплевать как это реализовано в плеере. для него логичнее что: sender - это клип на который нажали и он отослал событие о нажатии на себя..
__________________
Отряд Котовскага |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
KiL33, что за классы «СоздатьОкно» и «ЗакрытьОкно»? Давно действие стало классом?
|
|
|||||
|
etc, ты имеешь в виду неправильное именование классов?
ок, пусть CloseWindow будет ButtonClose -- CreateWindow будет NewWindow от этого правда что-то изменится? ![]() |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Нет, в данном случае нет. Сущность не может иметь название в виде действия или глагола.
|
![]() |
![]() |
Часовой пояс GMT +4, время: 08:54. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|