ActionScript 3
Arbeta med händelser
Sök…
Anmärkningar
Händelser är data som ett program kan skapa, utbyta och reagera på. Det asynkrona händelseflödet skickas över visningslistan av Flash-motoren som en reaktion på externa händelser, såsom musrörelser eller en annan ram som visas. Varje annat händelseflöde och all händelsehantering är synkron, så om en kodbit har genererat en händelse, behandlas alla reaktioner på den innan nästa kodrad körs, även om det finns flera lyssnare på en händelse, alla av dem skulle ha körts innan nästa händelse kunde behandlas.
Det finns flera större händelser associerade med Flash-programmering. Event.ENTER_FRAME
genereras innan Flash drar en annan ram, den signalerar hela skärmlistan för att förbereda sig för att dras och kan användas som en synkron timer. MouseEvent.CLICK
och dess syskon kan användas för att ta emot musinmatning från användaren, och TouchEvent.TOUCH_TAP
är en analog för pekskärmar. KeyboardEvent.KEY_DOWN
och KEY_UP
ger medel för att ta emot användarinmatning från tangentbordet, men deras användning i mobilavdelningen är nästan omöjlig på grund av enheter som inte har något fysiskt tangentbord. Slutligen Event.ADDED_TO_STAGE
när ett visningsobjekt får åtkomst till scenen och ingår i den globala visningslistan som får hela händelser som kan bubbla upp och ner i visningslistan.
De flesta händelser i Flash är komponentspecifika. Om du utformar din egen komponent som använder Flash-händelser, använd en flash.events.Event
efterkommandeklass och dess statiska String
att skapa din komponents händelseuppsättning.
Anpassade händelser med händelsedata
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;
}
}
}
Så här skickar du en anpassad händelse:
var dataObject:Object = {name: "Example Data"};
dispatchEvent(new CustomEvent(CustomEvent.START, dataObject))
Så här lyssnar du på anpassade händelser:
addEventListener(CustomEvent.STOP, stopHandler);
function stopHandler(event:CustomEvent):void
{
var dataObject:* = event.data;
}
Händelsehantering från visningslistan
package {
import flash.events.EventDispatcher;
public class AbstractDispatcher extends EventDispatcher {
public function AbstractDispatcher(target:IEventDispatcher = null) {
super(target);
}
}
}
Så här skickar du en händelse på en instans:
var dispatcher:AbstractDispatcher = new AbstractDispatcher();
dispatcher.dispatchEvent(new Event(Event.CHANGE));
Så här lyssnar du på händelser på en instans:
var dispatcher:AbstractDispatcher = new AbstractDispatcher();
dispatcher.addEventListener(Event.CHANGE, changeHandler);
function changeHandler(event:Event):void
{
}
Grundläggande händelsehantering
Flash skickar Events
för de flesta av sina objekt. En av de mest grundläggande händelserna är ENTER_FRAME
, som skickas (vid SWF-framerate) på varje visningslistobjekt.
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 !");
}
Denna funktion kommer att kallas asynkront på varje ram. Detta innebär att funktion som du tilldelar som onEnterFrame
händelsehanterare bearbetas innan någon annan Actionscript-kod som är kopplad till de drabbade ramar.
Lägg till dina egna händelser
Du kan skapa dina egna händelser och skicka dem genom att utöka 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);
}
}
Du kan sedan skicka den och lyssna på den med hjälp av en EventDispatcher
. Observera att de flesta blixtobjekt är händelseförmedlare.
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!"));
Observera att clone
krävs om du vill skicka om ditt evenemang på nytt.
Enkel mushändelsestruktur
Genom att använda event types
du enkelt minska koduppblåsning som ofta uppstår när du definierar händelser för många objekt på scenen genom att filtrera händelser i en funktion snarare än att definiera många händelseshanteringsfunktioner.
Föreställ dig att vi har 10 objekt på scenen som heter object1
, object2
... object10
Du kan göra följande:
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;
}
}
Fördelarna med denna metod inkluderar:
- Behöver inte ange antalet objekt som ska tillämpas på händelser.
- Behöver inte veta specifikt vilket objekt som interagerades med men ändå tillämpar funktionalitet.
- Lätt applicera evenemang i bulk.