サーチ…


備考

イベントとは、プログラムが作成、交換、反応することができるデータのことです。非同期イベントフローは、マウスの動きや表示されている別のフレームなどの外部イベントに対する反応として、Flashエンジンによってディスプレイリストにディスパッチされます。他のすべてのイベントフローとすべてのイベント処理は同期しているので、あるコードがイベントを生成している場合、そのコードの次の行が実行される前にすべての反応が処理されます。次のイベントが処理される前に実行されます。

Flashプログラミングに関連するいくつかの主要なイベントがあります。 Event.ENTER_FRAMEは、Flashが別のフレームを描画する前に生成され、描画リストの作成を準備するために表示リスト全体をEvent.ENTER_FRAMEし、同期タイマーとして使用できます。 MouseEvent.CLICKとその兄弟はユーザーからのマウス入力を受け取るために使用でき、 TouchEvent.TOUCH_TAPはタッチスクリーンのアナログです。 KeyboardEvent.KEY_DOWNおよびKEY_UPは、キーボードからのユーザ入力を受け取る手段を提供するが、物理的なキーボードを持たないデバイスのため、モバイル部門での使用はほとんど不可能である。最後に、表示オブジェクトがステージへのアクセスを受け取ると、 Event.ADDED_TO_STAGEが送出され、表示リストを上下にバブルできるイベントの全体を受け取るグローバル表示リストに含まれます。

Flashのほとんどのイベントはコンポーネント固有です。 Flashイベントを使用する独自のコンポーネントを設計する場合は、 flash.events.Event子孫クラスと静的Stringプロパティを使用してコンポーネントのイベントセットを作成します。

イベントデータを含むカスタムイベント

package
{
    import flash.events.Event;

    public class CustomEvent extends Event
    {
        public static const START:String = "START";
        public static const STOP:String  = "STOP";

        public var data:*;

        public function CustomEvent(type:String, data:*,
                                    bubbles:Boolean=false, cancelable:Boolean=false)
        {
            super(type, bubbles, cancelable);

            if (data)
                this.data = data;
        }
    }
}

カスタムイベントをディスパッチするには:

var dataObject:Object = {name: "Example Data"};

dispatchEvent(new CustomEvent(CustomEvent.START, dataObject))

カスタムイベントをリッスンするには:

addEventListener(CustomEvent.STOP, stopHandler);

function stopHandler(event:CustomEvent):void
{
    var dataObject:* = event.data;
}

表示リストのイベント処理

package {
import flash.events.EventDispatcher;

public class AbstractDispatcher extends EventDispatcher {

    public function AbstractDispatcher(target:IEventDispatcher = null) {
        super(target);
    }

}
}

インスタンスにイベントをディスパッチするには:

var dispatcher:AbstractDispatcher = new AbstractDispatcher();
dispatcher.dispatchEvent(new Event(Event.CHANGE));

インスタンス上のイベントをリスンするには:

var dispatcher:AbstractDispatcher = new AbstractDispatcher();
dispatcher.addEventListener(Event.CHANGE, changeHandler);

function changeHandler(event:Event):void
{
}

基本的なイベント処理

Flashは、ほとんどのオブジェクトのEventsをディスパッチします。最も基本的なイベントの1つは、すべての表示リストオブジェクトで(SWFのフレームレートで)送出されるENTER_FRAMEです。

import flash.display.Sprite;
import flash.events.Event;

var s:Sprite = new Sprite();
s.addEventListener(Event.ENTER_FRAME, onEnterFrame);

function onEnterFrame(e:Event)
{
    trace("I am called on every frame !");
}

この関数はすべてのフレームで非同期に呼び出されます。つまり、 onEnterFrameイベントハンドラとして割り当てた関数は、影響を受けるフレームにアタッチされているほかのActionScriptコードの前に処理されます。

自分のイベントを追加する

Eventクラスを拡張することで、独自のイベントを作成して送出することができます。

import flash.events.Event;

class MyEvent extends Event
{
    var data: String;
    
    static public var MY_EVENT_TYPE = "my_event_my_event_code";

    public function MyEvent(type: String, data: String)
    {
        this.data = data;
    }
    
    override public function clone():Event
    {
        return new MyEvent(type, data);
    }
}

その後、 EventDispatcherを使用してディスパッチしてそれを聞くことができEventDispatcher 。ほとんどのフラッシュオブジェクトはイベントディスパッチャであることに注意してください。

import flash.events.EventDispatcher;

var d = new EventDispatcher();
d.addEventListener(MyEvent.MY_EVENT_TYPE, onType);

function onType(e: MyEvent)
{
    trace("I have a string: "+e.data);
}

d.dispatchEvent(new MyEvent(MyEvent.MY_EVENT_TYPE, "Hello events!"));

イベントを再ディスパッチする場合は、 cloneメソッドが必要です。

シンプルなマウスイベント構造

event typesを使用すると、多くのイベント処理関数を定義するのではなく、1つの関数でイベントをフィルタリングすることで、ステージ上の多くのオブジェクトのイベントを定義するときによく発生するコードの膨らみを簡単に減らすことができます。

私たちは、ステージ上の10個のオブジェクトを持つ想像という名前のobject1object2 ... object10

あなたは以下を行うことができます:

var i: int = 1;
while(getChildByName("object"+i) != null){
    var obj = getChildByName("object"+i)
    obj.addEventListener(MouseEvent.CLICK, ObjectMouseEventHandler);
    obj.addEventListener(MouseEvent.MOUSE_OVER, ObjectMouseEventHandler);
    obj.addEventListener(MouseEvent.MOUSE_OUT, ObjectMouseEventHandler);
    obj.alpha = 0.75;
    i++;
}

function ObjectMouseEventHandler(evt:Event)
{
    if(evt.type == "click")
    {
        trace(evt.currentTarget + " has been clicked");
    }
    else
    {
        evt.currentTarget.alpha = evt.type == "mouseOver" ? 1 : 0.75;
    }
}

この方法の利点は次のとおりです。

  1. イベントを適用するオブジェクトの量を指定する必要はありません。
  2. どのオブジェクトがまだ相互作用されているかを特に知る必要はなく、依然として機能を適用します。
  3. イベントを一括して簡単に適用できます。


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow