Custom Events se tornaram muito práticos no desenvolvimento de aplicações mais complexas.
Você pode cria-los para casos específicos e geralmente eles vêm acompanhados de parametros específicos.
Vamos dizer que você cria uma evento customizável para uma classe de vídeo player e você utiliza ele para checar eventos de carregamento e execução do vídeo, como play, pause, progresso da execução e quando ela termina. Então quando você cria esse evento, é precisso passar esses parametros de alguma forma. Diretamente como parametros opcionais, através de um object, array ou da forma que você achar mais adequada.
Entretanto, durante o carregamento de um vídeo, você precisa dos bytesLoaded e bytestotal, mas não precisa da tempo de execução atual. Outro caso é quando você dispara um evento dizendo que o stream foi pausado ou quando a execução termina, você não precisa de nenhum parâmetro além do tipo de evento. O problema (problema não, mais como uma encheção de saco) é que, para cada parâmetro, você precisa criar uma variável na sua classe para armazenar o valor passado, caso contrário você não conseguira passsar nenhum deles atravéz do evento.
Para evitar isso, você pode definir seu evento como dynamic class. Para aqueles que não sabem, classes dinamicas permitem que você crie propriedades nelas em tempo de execução, como movie clips. Assim você consegue passar qualquer parâmetro atravéz de um objeto como parâmetro opcional do evento e armazena-lo na classe, dessa forma:
package app.events { import flash.events.Event; dynamic public class CustomEvent extends Event { public function CustomEvent(type:String, bubbles:Boolean = false, cancelable:Boolean = false, param:Object = null):void{ super(type, bubbles, cancelable); if(param){ for(var i:String in param){ this[i] = param[i]; } } } } }
Então quando você precisar passar qualquer valor, você adiciona ele em um objeto:
dispatchEvent(new CustomEvent(CustomEvent.LOAD_PROGRESS, false, false, {bytesLoaded:135817, bytesTotal:521387})); dispatchEvent(new CustomEvent(CustomEvent.VIDEO_PROGRESS, false, false, {currentTime:8.65})); dispatchEvent(new CustomEvent(CustomEvent.PAUSE));
E recebe ele dessa forma:
function onLoadProgress(event:CustomEvent):void{ trace(Math.floor(event.bytesLoaded*100/event.bytesTotal)+"% loaded"); } function onVideoProgress(event:CustomEvent):void{ trace("Current time:", event.currentTime); } function onPause(event:CustomEvent):void{ trace("Video paused"); }
Fantastic idea! Fantastic blog all round, actually.