继承自EventDispatcher受一类在Flash中,但没有收到自定义事件自定义、事件、EventDispatcher、Flash

2023-09-08 12:14:41 作者:打出自己一片天

我有当滑块移动时调度自定义事件,但我没有收到来自我创造了,而我也跟着相同的语法的我的闪光自定义事件不会触发

事件类:

 包{

    进口对象类型: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的);
                    跟踪(你好);

      }

    }
}
 
win8.1系统不能看斗鱼 一直提示您未安装Flash Player或者版本过低

解决方案

我觉得你的事件流的理解是有点过。我已经给了在我的闪光自定义事件不会触发(即我假设你没看过),我认为这是自定义使用事件 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