カスタム イベント (リスナー) についてかなり長い間調べてきましたが、作成に成功したことはありません。非常に多くの異なるメソッドがあり、Event クラスを拡張しますが、EventDispatcher クラスを拡張することもあり、非常に混乱します! これで一旦決着をつけて、適切なテクニックを学びたいと思います。
package{
import flash.events.Event;
public class CustomEvent extends Event{
public static const TEST:String = 'test'; //what exac is the purpose of the value in the string?
public var data:Object;
public function CustomEvent(type:String, bubbles:Boolean = false, cancelable:Boolean = false, data:Object = null):void
{
this.data = data;
super();
}
}
}
私の知る限り、ディスパッチされるイベントの要件を設定するカスタム クラスを作成する必要があります。
package
{
import flash.display.MovieClip;
public class TestClass extends MovieClip
{
public function TestClass():void {
if (ConditionForHoldToComplete == true) {
dispatchEvent(new Event(CustomEvent.TEST));
}
}
}
}
これが正しいかどうかはわかりませんが、これに沿ったものでなければなりません。
今私が欲しいのは、ターゲットに適用でき、特定のクラスを必要としないマウスイベントのようなものです。
次のように動作する必要があります。
package com.op_pad._events{
import flash.events.MouseEvent;
import flash.utils.Timer;
import flash.events.TimerEvent;
import flash.events.EventDispatcher;
import flash.events.Event;
public class HoldEvent extends Event
{
public static const HOLD_COMPLETE:String = "hold completed";
var timer:Timer;
public function SpriteEvent(type:String, bubbles:Boolean=true, cancelable:Boolean=false)
{
super( type, bubbles, cancelable );
timer = new Timer(1000, 1);
//somehow find the target where is event is placed upon -> target.addEventlistener
target.addEventListener(MouseEvent.MOUSE_DOWN, startTimer);
target.addEventListener(MouseEvent.MOUSE_UP, stopTimer);
}
public override function clone():Event
{
return new SpriteEvent(type, bubbles, cancelable);
}
public override function toString():String
{
return formatToString("MovieEvent", "type", "bubbles", "cancelable", "eventPhase");
}
//////////////////////////////////
///// c o n d i t i o n s /////
//////////////////////////////////
private function startTimer(e:MouseEvent):void
{
timer.start();
timer.addEventListener(TimerEvent.TIMER_COMPLETE, complete);
}
private function stopTimer(e:MouseEvent):void
{
timer.stop()
}
public function complete(e:TimerEvent):void {
dispatchEvent(new HoldEvent(HoldEvent.HOLD_COMPLETE));
}
}
}
これは明らかにうまくいきませんが、私が達成したいことのアイデアを提供するはずです. これは、mouseevent がほぼすべてに適用できるため、可能なはずです。主な問題は、イベントを実行してムービークリップやスプライトに適用できるようにするための要件をどこに設定すればよいかわからないことです。