我有一个自定义事件,当移动滑块时调度,但我没有收到我创建的继承调度程序类的事件,而我遵循与
My flash custom event doesn’t trigger的解决方案相同的语法
活动类:
package { import flash.events.Event; public class CustomEvent extends Event { public static const ON_DISPATCHER_EVENT = "onDispatcherEvent"; public var value:Number; public function CustomEvent(type:String,bubbles:Boolean=false,cancelable:Boolean=false):void { super(type,bubbles,cancelable); } } }
接线员:
package { import flash.events.EventDispatcher; import flash.events.Event; public class CustomEventDispatcher extends EventDispatcher { private var cEvent: CustomEvent; public function CustomEventDispatcher() { } public function raiseEvent(_value:Number) { cEvent = new CustomEvent(CustomEvent.ON_DISPATCHER_EVENT); cEvent.value = _value; dispatchEvent(cEvent); } } }
测试类:
package { import flash.display.*; import flash.net.*; import flash.events.*; import fl.events.SliderEvent; import fl.controls.Slider; public class TestCustomEvent extends MovieClip { private var cEvent: CustomEvent; public function TestCustomEvent() { addEventListener( Event.ADDED_TO_STAGE,init); } public function init( e:Event ):void { removeEventListener( Event.ADDED_TO_STAGE,init ); this.addEventListener(CustomEvent.ON_DISPATCHER_EVENT,OnDispatcherEvent); slider.addEventListener(SliderEvent.CHANGE,OnSliderEventChange); } public function OnDispatcherEvent(event:CustomEvent): void { trace(event.value); } public function OnSliderEventChange(event:SliderEvent) { cEvent = new CustomEvent(CustomEvent.ON_DISPATCHER_EVENT); cEvent.value = event.value; dispatchEvent(cEvent); trace("hello"); } } }
解决方法
我认为您对事件流程的理解有点偏差.我在
My flash custom event doesn’t trigger中给出的答案(我假设你没有阅读)我认为是使用自定义Event和IEventDispatcher对象的正确方法:
package { import flash.display.Sprite; import flash.events.Event; public class Main extends Sprite { private var _sliderSprite:SliderSprite; public function Main():void { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE,init); }// end function private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE,init); _sliderSprite = new SliderSprite(); _sliderSprite.x = (stage.stageWidth / 2); _sliderSprite.y = (stage.stageHeight / 2); addChild(_sliderSprite); }// end function }// end class }// end package import fl.controls.Slider; import fl.events.SliderEvent; import flash.display.Sprite; internal class SliderSprite extends Sprite { private var _slider:Slider; public function SliderSprite() { init(); }// end function private function init():void { _slider = new Slider(); addChild(_slider); _slider.addEventListener(SliderEvent.CHANGE,onSliderChange); addEventListener(CustomEvent.CUSTOM_EVENT_TYPE,onSliderSpriteCustomEventType); }// end function private function onSliderSpriteCustomEventType(e:CustomEvent):void { trace(e.value); }// end function private function onSliderChange(e:SliderEvent):void { dispatchEvent(new CustomEvent(CustomEvent.CUSTOM_EVENT_TYPE,e.value)); }// end function }// end class import flash.events.Event; internal class CustomEvent extends Event { public static const CUSTOM_EVENT_TYPE:String = "customEventType"; private var _value:Number; public function get value():Number { return _value; }// end function public function CustomEvent(type:String,value:Number,bubbles:Boolean = false,cancelable:Boolean = false) { _value = value; super(type,cancelable); }// end function override public function clone():Event { return new CustomEvent(type,value,cancelable); }// end function }// end class
[UPDATE]
[编辑08/04/2011 08:22]
我修改了代码以封装所有涉及调度和侦听事件的代码,以及将事件处理程序排除到另一个类(EventDispatcherManager).
import flash.display.Sprite; import flash.events.IEventDispatcher; internal class SliderSprite extends Sprite { private var _slider:Slider; private var _eventDispatcherManager:EventDispatcherManager; public function SliderSprite() { init(); }// end function private function init():void { _slider = new Slider(); addChild(_slider); _eventDispatcherManager = new EventDispatcherManager(IEventDispatcher(_slider)); }// end function }// end class import fl.controls.Slider; import fl.events.SliderEvent; import flash.events.EventDispatcher; internal class EventDispatcherManager extends EventDispatcher { public function EventDispatcherManager(slider:IEventDispatcher) { slider.addEventListener(SliderEvent.CHANGE,onSliderChange); this.addEventListener(CustomEvent.CUSTOM_EVENT_TYPE,onCustomEventType); }// end function private function onSliderChange(e:SliderEvent):void { this.dispatchEvent(new CustomEvent(CustomEvent.CUSTOM_EVENT_TYPE,e.value)); }// end function private function onCustomEventType(e:CustomEvent):void { trace(e.value); }// end function }// end function