我有当滑块移动时调度自定义事件,但我没有收到来自我创造了,而我也跟着相同的语法的我的闪光自定义事件不会触发
事件类:
包{
进口对象类型:flash.events.Event;
公共类自定义事件扩展事件
{
公共静态常量ON_DISPATCHER_EVENT =onDispatcherEvent;
公共VAR值:数字;
公共功能自定义事件(类型:字符串,气泡:布尔=假,取消:布尔=假):无效
{
超(类型,泡沫,取消);
}
}
}
接线员:
包{
进口flash.events.EventDispatcher使用;
进口对象类型:flash.events.Event;
公共类CustomEventDispatcher扩展EventDispatcher {
私人VAR CEvent的:自定义事件;
公共职能CustomEventDispatcher(){
}
公共职能的RaiseEvent(_value:号码){
CEvent的=新的自定义事件(CustomEvent.ON_DISPATCHER_EVENT);
cEvent.value = _value;
则dispatchEvent(CEvent的);
}
}
}
测试类:
包{
导入flash.display使用*。
进口flash.net *。
进口flash.events *。
进口fl.events.SliderEvent;
进口fl.controls.Slider;
公共类TestCustomEvent扩展影片剪辑{
私人VAR CEvent的:自定义事件;
公共职能TestCustomEvent(){
的addEventListener(Event.ADDED_TO_STAGE,INIT);
}
公共职能的init(五:事件):无效{
removeEventListener(Event.ADDED_TO_STAGE,INIT);
this.addEventListener(CustomEvent.ON_DISPATCHER_EVENT,OnDispatcherEvent);
slider.addEventListener(SliderEvent.CHANGE,OnSliderEventChange);
}
公共职能OnDispatcherEvent(事件:自定义事件):无效{
跟踪(event.value);
}
公共职能OnSliderEventChange(事件:的SliderEvent){
CEvent的=新的自定义事件(CustomEvent.ON_DISPATCHER_EVENT);
cEvent.value = event.value;
则dispatchEvent(CEvent的);
跟踪(你好);
}
}
}
解决方案
我觉得你的事件流的理解是有点过。我已经给了在我的闪光自定义事件不会触发(即我假设你没看过),我认为这是自定义使用事件
和 IEventDispatcher,请
对象的正确方法:
包
{
进口flash.display.Sprite;
进口对象类型:flash.events.Event;
公共类主要扩展Sprite
{
私人VAR _sliderSprite:SliderSprite;
公共函数main():无效
{
如果(阶段)的init();
其他的addEventListener(Event.ADDED_TO_STAGE,INIT);
} //函数结束
私有函数初始化(E:事件= NULL):无效
{
removeEventListener(Event.ADDED_TO_STAGE,INIT);
_sliderSprite =新SliderSprite();
_sliderSprite.x =(stage.stageWidth / 2);
_sliderSprite.y =(stage.stageHeight / 2);
的addChild(_sliderSprite);
} //函数结束
} //结束类
} //结束包
进口fl.controls.Slider;
进口fl.events.SliderEvent;
进口flash.display.Sprite;
内部类SliderSprite扩展Sprite
{
私人VAR _slider:滑块;
公共职能SliderSprite()
{
在里面();
} //函数结束
私有函数的init():无效
{
_slider =新的Slider();
的addChild(_slider);
_slider.addEventListener(SliderEvent.CHANGE,onSliderChange);
的addEventListener(CustomEvent.CUSTOM_EVENT_TYPE,onSliderSpriteCustomEventType);
} //函数结束
私有函数onSliderSpriteCustomEventType(五:自定义事件):无效
{
跟踪(e.value);
} //函数结束
私有函数onSliderChange(E:的SliderEvent):无效
{
则dispatchEvent(新的自定义事件(CustomEvent.CUSTOM_EVENT_TYPE,e.value));
} //函数结束
} //结束类
进口对象类型:flash.events.Event;
内部类自定义事件扩展事件
{
公共静态常量CUSTOM_EVENT_TYPE:字符串=customEventType;
私人VAR _value:数字;
公共职能的get()值:数字
{
返回_value;
} //函数结束
公共功能自定义事件(类型:字符串,
值:号码,
泡沫:布尔=假,
取消:布尔= FALSE)
{
_value =值;
超(类型,泡沫,取消);
} //函数结束
重写公共职能的clone():事件
{
返回新的自定义事件(类型,值,泡沫,取消);
} //函数结束
} //结束类
[更新] 的
我已经修改了code封装所有code,涉及调度和听/事件,以及excuting事件处理程序,到另一个类( EventDispatcherManager
)。
进口flash.display.Sprite;
进口flash.events.IEventDispatcher;
内部类SliderSprite扩展Sprite
{
私人VAR _slider:滑块;
私人VAR _eventDispatcherManager:EventDispatcherManager;
公共职能SliderSprite()
{
在里面();
} //函数结束
私有函数的init():无效
{
_slider =新的Slider();
的addChild(_slider);
_eventDispatcherManager =新EventDispatcherManager(IEventDispatcher,请(_slider));
} //函数结束
} //结束类
进口fl.controls.Slider;
进口fl.events.SliderEvent;
进口flash.events.EventDispatcher使用;
内部类EventDispatcherManager扩展EventDispatcher
{
公共职能EventDispatcherManager(滑块:IEventDispatcher,请)
{
slider.addEventListener(SliderEvent.CHANGE,onSliderChange);
this.addEventListener(CustomEvent.CUSTOM_EVENT_TYPE,onCustomEventType);
} //函数结束
私有函数onSliderChange(E:的SliderEvent):无效
{
this.dispatchEvent(新自定义事件(CustomEvent.CUSTOM_EVENT_TYPE,e.value));
} //函数结束
私有函数onCustomEventType(五:自定义事件):无效
{
跟踪(e.value);
} //函数结束
} //函数结束
I have a custom event that is dispatched when a slider is moved but I receive no event from inherited dispatcher class I created whereas I followed the same syntax as solution for My flash custom event doesn't trigger
Event class:
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);
}
}
}
Dispatcher:
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);
}
}
}
Test class:
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");
}
}
}
解决方案
I think your understanding of the event flow is a bit off. The answer I already gave in My flash custom event doesn't trigger (that I'm assuming you didn't read) I think is the proper way to use custom Event
and IEventDispatcher
objects:
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, bubbles, cancelable);
}// end function
override public function clone():Event
{
return new CustomEvent(type, value, bubbles, cancelable);
}// end function
}// end class
[UPDATE] [EDITED 08/04/2011 08:22]
I've modified the code to encapsulate all code involving dispatching and listening to/for events, as well as excuting event handlers, into another class(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