PDA

Просмотр полной версии : listeners я запутался, помогите понять.


solo19770701
23.07.2008, 18:01
Всем доброго времени суток. Решил вплотную заняться изучением слушателей. И сразу же возникло несколько вопросто на которые в хелпе не могу найти ответов. Почему это работает

var myListener:Object = new Object();
myListener.click = function(){
trace("button has been pressed"
};
myButton.addEventListener("click", myListener);
а вот это нет

var myListener:Object = new Object();
myListener.onRollOver = function(){
trace("button has been Rolled Over"
};
myButton.addEventListener("onRollOver", myListener);
Как я мог понять из моих мытаний, слушатели работают только с опредененным набором коман methods. В хелпе написано что для каждого класса свой набор команд которые могут работать со слушателями. Но я не смог их найти. Искал по method Name, хотя бы для Button Class, но там стандартный набор команд как onPress, onRollOver and etc. Но какие из них будут работать со слушателями? Тоже самое с клипами, текстовыми полями и т.д.
Дальше хуже, второе что меня поставило в тупик в чем разница между addListener and addEventListener. Как я понял из книги которую я читаю первый используется в MovieClipLoader Class, но в хелпе, если я не ошибаюсь они используют addListener и в обычных примерах.:moder:

wvxvw
23.07.2008, 18:45
addListener() - можно вызвать у объекта инициализированого AsBroadcaster'ом, что это значит:
когда вы вызываете AsBroadcaster.initialize(myObject), AsBroadcaster создаст массив слушателей (туда можно занести что угодно) и допишет myObject методы addListener, removeListener, broadcastMessage.
Как это будет работать:
когда myObject вызовет broadcastMessage("someString", argument0, ...argumentN), то это будет так же значить, что у всех объектов занесенных в массив _listeners у myObject будет вызван метод someString и в него будут переданы аргументы argument0, ...argumentN.

addEventListener() - можно вызвать у объекта инициализированого EventDispatcher'ом (или EventDispatcherMX). Что это значит:
у myObject будут методы addEventListener, removeEventListener, dispatchEvent. Когда вы вызовете dispatchEvent у myObject то все методы других объектов подписаных на это событие будут вызваны, и им будет передан объект события в качестве аргумента:
пример:

obj.someMethod = function(evtObj:Object):Void
{
trace(evtObj.target + " : " + evtObj.type);
}
eventDispatcherInstance.addEventListener("someEvent", obj.someMethod);
Это значит, что когда eventDispatcherInstance.dispatchEvent() то у obj будет вызван someMethod(). Но, если честно, то мне реализация EventDispatcherMX не нравится, поэтому я предпочитаю пользоваться своим похожим классом. Но если вы собираетесь использовать ММ компоненты, то, для того, чтобы узнать какие евенты может генерить какой компонент - лезем в иcxодники компонентов =) евенты описаны по-моему так:
[Event("change")]
[Event("click")]

solo19770701
23.07.2008, 19:32
to wvxvw: Спасибо за развернутый урок. Поправь меня если я не прав, addListener() не привязан MovieClipLoader Class, а может быть использован и с другими классами.

chingachgoog
23.07.2008, 19:44
Почему это работает
... а вот это нет
...
Дальше хуже, второе что меня поставило в тупик в чем разница между addListener and addEventListener. Как я понял из книги которую я читаю первый используется в MovieClipLoader Class, но в хелпе, если я не ошибаюсь они используют addListener и в обычных примерах.

Дело в том, что addEventListener - это пользовательсктий метод класса EventDispatcher, с той лишь разницей, что за вас его написала макромедия (у вас на компе записан файл EventDispatcher.as и прочие).
А addListener - это реальный (встроенный) метод.

Потом, клипы изначально слышат (подписаны на) мышиные события (типа onRollOver), а остальные методы надо еще заставить услышать.

solo19770701
23.07.2008, 20:17
to chingachgoog: а как найти какие медоды работают с addEventListener. Попробовал в хелпе забить [Event("change")] или [Event("click")], ничего нету, пишу Event("change"), так там куча ненужного материала. А методом вытка тоже пытаться не хочется.Из книги нашел некоторые методы, как click, itemRollOver, change. Но дело в том что каждый из этих событий привязан к определенному элементу. А к какому какой, вот это мой вопрос. (кроме click, этот уже понятно кому принадлежит)

wvxvw
23.07.2008, 22:21
Если честно, то я не уверен, есть ли такая сборка по всем евентам всех компонентов, но, в принципе, как мне кажется не составит большого труда:
Вы знаете, какой компонент собираетесь использовать ->
идем вот сюда: C:\Program Files\Adobe\Adobe Flash CS3\en\First Run\Classes\mx\controls
например (ну, или куда там Флеш установлен), отыскиваем нужный компонент и смотрим [Event()] тэги.
Ну, только, это, положа руку на сердце... они не хорошие эти компоненты =) Если вы планируете долгосрочную разработку, с последующей поддержкой или просто компилировать чем-то нормальным типа MTASC'а, то головной боли будет гарантировано много от их использования =) А если слепить, отдать и быстро свалить - тогда можно =)

Да, ксати, есть еще и UIEventDispatcher класс (наплодили ж их =)
Вобщем, скорее всего, что все, что наследуется от UIComponent скорее всего использует именно его, а значит в наличие могут быть следующие события:
UIEventDispatcher.keyDown
UIEventDispatcher.keyUp
UIEventDispatcher.load
UIEventDispatcher.mouseDown
UIEventDispatcher.mouseOut
UIEventDispatcher.mouseOver
UIEventDispatcher.mouseUp
UIEventDispatcher.unload

Читать тут:
http://livedocs.adobe.com/flash/9.0/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&file=00003641.html

Но, вполне возможно, что их реально больше, да и кроме того, создать еще одно событие вобщем-то не сложно =)

solo19770701
23.07.2008, 22:28
to wvxvw: понял. Спасибо.

Волгоградец
24.07.2008, 10:33
Эти события нужно искать в Components Reference. Например, выбираешь Button component --> Button class --> Event summary. В случае с Button component своих событий он не имеет - событие click наследуется от SimpleButton. С клипами тоже работает.
Можно так создать события:
var someObject:Object = new Object();
AsBroadcaster.initialize(someObject);

myListener = new Object();
myListener.customRollOver = Delegate.create(this, testMsg);
movClip.onRollOver = Delegate.create(this, test);
someObject.addListener(myListener);

function testMsg ():Void{
trace("button has been Rolled Over")
}

function test ():Void{
someObject.broadcastMessage("customRollOver");
}