Általános értelemben az események olyan futásidejű történések, amelyekkel a tervezés szakaszában még nem ismerünk előre (leüti-e a billentyűt, ha igen melyiket), ezek kézbentartásában segít nekünk az eseménykezelés. Az események szerves részét képezik az actionscript 3-nak + ezen kívül nem tudnánk programjainkat interaktívvá varázsolni. Mivel ilyen fontos a szerepük, ezért a nyelv alkotó egy elég jól átgondolt rendszert, és sok nyelvi eszközt sorakoztat fel a segítségünkre. Ebben a postban mi csak az eseménykezelés alapjaival ismerkedünk meg. Alapvetően 2 féle esemény létezik as3-ban: beépített és az általunk készítettek, Mi most az előbbivel fogunk foglalkozni.

Először nézzük, meg miként is történik egy eseményhívás.

Az események kezelésére ún. eseményfigyelőket használunk, amik technikai értelemben egyszerű függvények, melyek az események bekövetkezését követően futnak le. Amikor ez megtörténik, akkor az Actionscript az összes olyan eseményfigyelőt értesíti, amelyik be volt jegyezve az adott eseményez. Eseményindításkor mindig létrejön egy objektum, ami az eseményről tartalmaz információkat (leütött billentyű, egér pozíciója, stb.), ez az objektum, az Event osztályhoz vagy annak valamilyen leszármazottjához tartozik. Ahhoz, hogy valóban figyelni is tudjuk az eseményeket, egy objektumhoz hozzá kell rendelni az esemény típusát, ill. az eseményfigyelőnket, amit EventDispatcher osztályban található addEventListener() függvény segítségével tudunk megtenni. Mindezek után nézzük meg hogyan is néz ki a gyakorlatban.

A szemléletesség kedvéért maradjunk az előző postokból már megismert kattintás eseménynél.

//tegyük fel, hogy korábban, már hozzáadtuk a btn nevű objektumot a stagehez
btn.addEventListener(MouseEvent.CLICK,klikk);

function klikk(evt:MouseEvent):void {
	trace("X: "+evt.localX + "\nY: "+evt.localY);
}
//egy lehetséges kimenet:
//X: 11
//Y: 20

Legelsőnek hozzárendelem a btn nevű célobjektumhoz a CLICK eseményt és klikk eseményfigyelőt. Alatta pedig megvalósítom klikk függvényt. Figyeljük, meg hogy ezeknek a speciális függvényeknek mindig kötelezően át kell venniük egy paramétert, különben fordítási hibát kapunk. Ez a paraméter nem más, mint a korábban már említett eseményobjektum, ami tartalmazza az eseménnyel kapcsolatos információkat. A függvény törzsében csak kiíratom az átvett objektum x és y paramétereit, amiket az egér aktuális pozíciója határoz meg.

Érdemes megjegyezni, hogy az alábbi kód is teljesen helyes:

btn.addEventListener("click",klikk);

Ez azért lehetséges, mert az addEventListener() szignatúrája ez: addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void. Tehát, mint látjuk az adott event típusát stringként várja. Akkor hogy lehet az, hogy a MouseEvent.CLICK elnevezés nem okozott hibát? A magyarázat egyszerű MouseEvent.CLICK értéke valójában egy string. Ezt a megoldást, hogy karakterláncot adunk át nem szokás használni, mert nem egyértelmű, hogy mit szeretnénk, rontja a kód olvashatóságát, tehát kerüljük. Mint látjuk addEventListener() több paramétere van, mint amennyit én most itt ismertetek, de ezek csak feleslegesen elbonyolítanák a példákat.

Most hogy tudunk eseményeket bejegyezni, azt is meg kéne nézni miként tudjuk azokat eltávolítani, ha már szükségtelenné váltak. A removeEventListener() fog nekünk ebben segíteni, ami szinétn az EventDispatcher osztályban kapott helyet.

//tegyük fel, hogy korábban, már hozzáadtuk a btn nevű objektumot a stagehez
btn.addEventListener(MouseEvent.CLICK,klikk);

function klikk(evt:MouseEvent):void {
	trace("X: "+evt.localX + "\nY: "+evt.localY);
	btn.removeEventListener(MouseEvent.CLICK,klikk);
}

Ha lefuttatjuk az alábbi kis kódot, azt tapasztaljuk, hogy az első kattintás után nem írja ki a cursorunk helyét, és ez teljesen rendjét is van, hiszen eltávolítottuk a figyelőnket a klikk-ben. Fontos, hogy mindig távolítsuk el a már nem használt listenerekt, hisz erőforrásaink nem végesek, és feleslegesen ne terheljük meg a futtatókörnyezetet.

Most nézzünk meg az Event osztály néhány típusát, melyek bármely más eseményben (pl.: MouseEvent) is elérhetőek, hiszen az Eventből származnak.

type: A kiváltó esemény típusa.

btn.addEventListener(MouseEvent.CLICK,klikk);

function klikk(evt:MouseEvent):void {
	trace(evt.type);
}

//kimenet:
//click

currentTaret: Az az objektum, amihez hozzáadtuk az eseményfigyelőnket.

target: Visszaadja, hogy honnan származik az esemény.

A target és a currentTraget fogalma gyakran egybeesik, például a fenti példánknál is. De vannak esetek, amikor nem ilyen egyértelmű, hogy melyiknek mi is a tartalma. Nézzük meg az alábbi kódot:

addCircle();
btn.addEventListener(MouseEvent.CLICK,klikk);

function klikk(evt:MouseEvent):void {
	if (evt.target!=evt.currentTarget) {
		Sprite(evt.target).x=Sprite(evt.target).x+30;
	}
}
function addCircle():void {
	var circle:Sprite=new Sprite  ;
	circle.graphics.beginFill(0x000000);
	circle.graphics.drawCircle(1,50,25);
	circle.buttonMode=true;
	btn.addChild(circle);
}

Aki nem teljesen érti, az addCircle() függvényt, az ne bánkódjon, nincs rá szükség a példa megértéséhez, csak egy kört rajzol ki és hozzáadja a már eddig is létező btn-hez. Fontos, hogy nem a színpadhoz adjuk hozzá, hanem a btn-hez (ha hivatkozni akarnánk rá így tehetnénk: btn.circle)! A klikk törzsében ezúttal csak annyit történik, hogy  abban az esetben, amikor a célobjektum nem egyezik meg a kiváltóval, akkor azt az objektumot, amelytől származik az esemény eltolom 30-cal. Még érdemes megemlíteni a típus konverziót amikor az evt nevű MouseEvent típusú objektumot átalakítom Sprite típusúvá a biztonságos típushasználat miatt. Nézzük meg működés közben:

A tartalom megtekintéséhez Flash Player-re van szükség.

Abban az esetben, ha a téglalapra kattintunk, akkor megegyezik a target és a currentTarget, tehát nem történik semmi. Viszont, amikor a körre kattintunk, akkor már közel sem azonos a kettő tartalma, tehát eltolódik a kör. Kicsit talán erőltettet a példa, de remélem siketült megérteni mi a két fogalom között a különbség.

Még egy apró gondolta a végére. Ha egy azonos objektumhoz hozzáadunk egy azonos típusú eseményt, csak másik eseményfigyelővel, akkor szekvenciálisan az az fentről lefelé hajtódik végre.

btn.addEventListener(MouseEvent.CLICK,klikk1);
btn.addEventListener(MouseEvent.CLICK,klikk2);

function klikk1(evt:MouseEvent):void {
	trace("Hello");
}

function klikk2(evt:MouseEvent):void {
	trace("World");
}
//kimenet:
//Hello
//World

Van egyéb lehetőségünk is a hívási sorrend befolyásolására, de azt majd máskor.



Szólj hozzá a posthoz