7

そのため、クロージャやメモリ リークを作成せずにデータを渡すことができるように、イベントを設定する方法が必要です。これは私が持っている限りです:

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]

私の目標は、私が発火したものだけでなく、フラッシュの発火イベントから渡されるように渡したいカスタムデータを取得することです。たとえば、ムービークリップを loader.COMPLETE イベントと一緒に渡して、結果のビットマップを配置したい場合はどうすればよいでしょうか?

4

2 に答える 2

4

追加のデータをディスパッチするようにEventクラスを拡張しました。次に、Loaderクラスでカスタムイベントタイプをディスパッチする場合は、Loaderクラスを拡張してそれを実行します(またはこれを実行する他のクラス)。この例では、URLLoaderをこの機能でオーバーライドします(Loaderは実際には2つのオーバーライドされたクラスを必要とする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
}

バム!本質的にディスパッチされたイベントに関するカスタムデータ!

于 2009-04-17T02:21:36.190 に答える
0

カスタム イベントを作成する最もクリーンな方法を次に示します。通常、イベント タイプには、すべて大文字で入力された public static 参照があります。イベントがディスパッチされると、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));
于 2009-04-17T05:44:07.403 に答える