Event’ai (PART I )
// July 31st, 2008 // AS3
Event’ai
AS3 kalboje yra naudojama flash.events.EventDispatcher klasė darbui su įvykiais ( Events ). Kiekvieną kartą norėdami pagauti tam tikrą Event’ą reikės naudoti EventDispatcher’io metodus. Event”ų klausytojai AS3, yra susisteminti, t.y. visi jie uždedami naudojant ta patį metodą addEventListener, kurio pagalba yra klausomasi Eventų ir reguojama atitinkamai, t.y. iškviečiamos konkrečios funkcijos. Visą tai yra intergruota į Flash klasę.
Pavyzdys:
Tarkime mes turime objektą kuri norėsime judinti pelės pagalba.
Objektui uždedame Event’ų listener’ius.
Pirmas listener’is stebės ar pelė yra paspausta ant objekto, jeigu taip tada pradėti draginti objektą
Antras listener’is stebės ar pelė yra atleista nuo objekto, jeigu taip tada nustoti draginti objeką
myMovieClip.addEventListener(MouseEvent.MOUSE_DOWN, onStartDrag);
myMovieClip.addEventListener(MouseEvent.MOUSE_UP, onStopDrag);
private function onStartDrag ( evt : MouseEvent ) : void {
evt.target.startDrag();
}
private function onStopDrag ( evt : MouseEvent ) : void {
evt.target.stopDrag();
}
Dviejų Event’ų klausytojų MouseEvent.MOUSE_DOWN ir MouseEvent.MOUSE_UP logikos kaip viskas ir aišku. Kai įvyksta Event’as jis iškviečia konkrečia funkciją. Fuknciją pasigauna Event’ą, tada jo pagalba nustato objektą target kuriam tas Event’as buvo įvykdytas, tokiu budu koncrečiam objektui yra priskiriama užduotis – startDrag(); arba stopDrag();
Šios funkcijos yra universalios, evt.target leidžia mums judinti bet kurį objeta Scenoje, nes jis nerą pririštas prie konkretaus objekto. todėl drasiai galima pridėti dar tokį kodo gabaliuką:
myNewMovieClip.addEventListener(MouseEvent.MOUSE_DOWN, onStartDrag);
myNewMovieClip.addEventListener(MouseEvent.MOUSE_UP, onStopDrag);
Toliau man kilo viena idėja, kas atsitiktu jeigu Event’as MouseEvent.MOUSE_UP įvyktų už Stage’o ribų?
Gavosi toks rezultatas:
Trečias listener’is stebės ar pelė nepaliko mūsų stage’o, jeigu taip tada nustoti draginti?
stage.addEventListener( Event.MOUSE_LEAVE, onMouseLeaveStopDrag );
Vienu metu jau buvau supanikavęs jog MOUSE_LEAVE Event’o nėra. ( Ši funkcija stebi ar pelė nepaliko stage’o ) Nes jo nebuvo prie MouseEvent klasės, po neilgos paieškos išsiaiškinau kad jis yra pririštas prie Event klasės. Su šita funkciją teko paplūšėti, nes listener’is yra pririštas prie stage’o, ir kai pelė palieka stage’ą, mes kaip ir nebeturime evt.target, todėl teko šiek tiek modifikuoti prieš tai buvusias funkcijas:
var myDragingObject : Object = new Object ();
private function onStartDrag ( evt : MouseEvent ) : void {
myDragingObject = evt.target;
evt.target.startDrag();
}
private function onStopDrag ( evt : MouseEvent ) : void {
myDragingObject = new Object ();
evt.target.stopDrag();
}
private function onMouseLeaveStopDrag ( evt : Event ) : void {
myDragingObject.stopDrag();
}
Atrodytų viskas puiku, bet… po kelių testavimų ir konsultacijų priejau prie išvados, kad taip paprastai niekas čia neveiks. Event.MOUSE_LEAVE, negali įvykti tuo metu kai MouseEvent.MOUSE_DOWN yra aktyvus ( t.y. kai pelės kairysis mygtukas yra paspaustas ) Šitoje vietoje mes kol kas sustosime ir šiai sričiai vėlesniuose tyrimuose skirsime daugiau laiko.
Įsivaiduokite jūs turite nuotraukų galeriją, ir reikia kiekvienai ikeltai nuotraukai uždeti sąlygas:
- kai pelė užlipa ant nuotraukos, nuotrauka turi nublankti ( alpha = 0.4 )
- kai pelė nulipa nuo nuotraukos, nuotrauka turi išryškėti ( alpha = 1 )
Visų pirma noriu užkabinti vieną dalykėli, kadangi AS3 yra keli iš požiūrio vienodi MouseEvent’ai:
MouseEvent.ROLL_OVER ir MouseEvent.ROLL_OUT
MouseEvent.MOUSE_OVER ir MouseEvent.MOUSE_OUT
Apie jų skirtumus yra labai paprastai ir gražiai paaiškinta čia. Pridedu ir swf’ą.
Taigi, mes turime tokia situaciją:
private var myGallery : MovieClip = new MovieClip ();
private var myImage_1 : MyObject;
private var myImage_2 : MyObject;
public function newGallery () {
myImage_1 = new MyObject ( "square", 0x669933, 40, undefined, undefined, false );
myImage_2 = new MyObject ( "square", 0x2255AA, 40, undefined, undefined, false );
myImage_2.x = 50;
myGallery.addChild( myImage_1 );
myGallery.addChild( myImage_2 );
addChild( myGallery );
}
Tam kas nereikėtų n kartų perrašinėti šitos kodo dalies, arba dėti ją į ciklą:
myImage_*.addEventListener( MouseEvent.MOUSE_OVER, onMouseRollOverImage);
myImage_*.addEventListener( MouseEvent.MOUSE_OUT, onMouseRollOutImage );
mes galime priskirti listener’į prie myGallery kintamojo:
myGallery.addEventListener( MouseEvent.MOUSE_OVER, onMouseRollOverImage);
myGallery.addEventListener( MouseEvent.MOUSE_OUT, onMouseRollOutImage);
Tada eina mūsų funkcijos kurios bus atsakingos už paveikliukų ryškėjimą/blankimą
private function onMouseRollOverImage ( evt : MouseEvent ) : void {
evt.target.alpha = 0.4;
}
private function onMouseRollOutImage ( evt : MouseEvent ) : void {
evt.target.alpha = 1;
}
Kaip matote jos vėl gi nėra pririštos prie konkrečių objektų. Remiantis Event’u yra nustatomas konkretus objektas ir jam yra priskiriami tam tikri parametrai, šiuo atveju alpha.
Parsisiųsti: Galerija
