Как изменить существующие события AS3, чтобы можно было передавать данные?

StackOverflow https://stackoverflow.com/questions/758322

Вопрос

Поэтому мне нужен способ настройки событий, чтобы я мог передавать данные, не создавая замыканий\утечек памяти.Это все, что у меня есть:

package com.events {
    import flash.events.Event;

    public class CustomEvent extends Event {
        public static const REMOVED_FROM_STAGE:String = "removedFromStage";
        public var data:*;

        public function CustomEvent(type:String, customData:*=null, bubbles:Boolean=false, cancelable:Boolean=false) {
            super(type, bubbles, cancelable);
            this.data = customData;
        }

        public override function clone():Event {
            return new CustomEvent(type, data, bubbles, cancelable);
        }

        public override function toString():String {
            return formatToString("CustomEvent", "type", "data", "bubbles", "cancelable", "eventPhase");
        }
    }
}

Это дает мне следующее поведение:

function testme(e:Event) {
    trace(e); 
}

test_mc.addEventListener(CustomEvent.REMOVED_FROM_STAGE, testme);
test_mc.dispatchEvent(new CustomEvent(CustomEvent.REMOVED_FROM_STAGE, 42));
//Traces [CustomEvent type="removedFromStage" data=42 bubbles=false cancelable=false eventPhase=2]
removeChild(test_mc);
//Traces [Event type="removedFromStage" bubbles=false cancelable=false eventPhase=2]

Моя цель — получить пользовательские данные, которые я хочу передать, для передачи из событий flash, а не только из тех, которые я запускаю.Например, что, если я хочу передать мувиклип вместе с событием loader.COMPLETE, чтобы поместить туда полученное растровое изображение?

Это было полезно?

Решение

Вы расширили класс Event, чтобы он мог отправлять дополнительные данные, теперь, если вы хотите, чтобы класс Loader отправлял ваш собственный тип события, расширьте класс Loader для этого (или любой другой класс, с которым вы хотите сделать это).В этом примере я переопределяю URLLoader с помощью этой функции (поскольку Loader фактически отправляет события из своего contentLoaderInfo, которому нужны два переопределенных класса, и я просто хочу, чтобы это было проще)


package com.net
{
    import flash.net.URLLoader;
    import flash.events.Event;

    import com.events.CustomEvent;

    public class CustomLoader extends URLLoader
    {
        // URLLoader already has a data property, so I used extraData
        public var extraData:*;

        override public function dispatchEvent(event: Event) : Boolean
        {
            var customEvent: CustomEvent = new CustomEvent(event.type, extraData, event.bubbles, event.cancelable);
            return super.dispatchEvent(customEvent);
        }
    }
}

Теперь, чтобы использовать это с вашим классом CustomEvent, попробуйте этот код в своем .fla.


import com.net.CustomLoader;
import com.events.CustomEvent;

var loader: CustomLoader = new CustomLoader();
loader.extraData = "Extra Data";
loader.load(new URLRequest("test.xml"));
loader.addEventListener(Event.COMPLETE, loadComplete);

function loadComplete(event: CustomEvent) : void
{
    trace(event.data); // Extra Data
}

БАМ!Пользовательские данные о ваших изначально отправляемых событиях!

Другие советы

Ниже показан самый простой способ создания пользовательского события.Обычно типы событий имеют общедоступные статические ссылки, набранные заглавными буквами.При отправке события оно передает объект Event или CustomEvent методу обработчика событий.Здесь вы можете получить переданное значение.

package com.hodgedev.events 
{
    import flash.events.Event;

    public class CustomEvent extends Event 
    {
        public static const VALUE_CHANGED:String = "VALUE_CHANGED";
        public var value:Number;

        public function CustomEvent(pValue:Number) 
        { 
            super(CustomEvent.VALUE_CHANGED);
            value = pValue;
        } 
        public override function clone():Event 
        { 
            return new CustomEvent(value);
        }
    }
}

Когда мы отправляем события, мы создаем новый экземпляр события, которое будет передано как таковое.

private var _someValue:int = 12;
dispatchEvent(new CustomEvent(_somevalue));
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top