Olay işleyicileri olarak da adlandırılan olay dinleyicileri, Flash Player ve AIR uygulamasının belirli olaylara yanıt olarak çalıştırdığı işlevlerdir. Olay dinleyicisi ekleme, iki adımdan oluşan bir işlemdir. İlk olarak, Flash Player veya AIR uygulamasının olaya yanıt olarak çalıştırması için bir işlev veya sınıf yöntemi oluşturursunuz. Bu bazen dinleyici işlevi veya olay işleyici işlevi olarak adlandırılır. İkinci olarak, dinleyici işlevinizi olayın hedefiyle veya uygun olay akışında bulunan herhangi bir görüntüleme listesi nesnesiyle kaydetmek için
addEventListener()
yöntemini kullanırsınız.
Dinleyici işlevi oluşturma
Dinleyici işlevlerinin oluşturulması, ActionScript 3.0 olay modelinin DOM olay modelinden değişiklik gösterdiği bir noktadır. DOM olay modelinde, olay dinleyicisi ile dinleyici işlevi arasında net bir ayrım vardır: olay dinleyicisi, EventListener arabirimini uygulayan bir sınıf örneğiyken, dinleyici işlevi, o sınıfın
handleEvent()
adındaki bir yöntemidir. DOM olay modelinde, gerçek dinleyici işlevini değil, dinleyici işlevini içeren sınıf örneğini kaydedersiniz.
ActionScript 3.0 olay modelinde, olay dinleyicisi ile dinleyici işlevi arasında belirgin bir fark yoktur. ActionScript 3.0, bir EventListener arabirimine sahip değildir ve dinleyici işlevleri, sınıfın dışında veya sınıfın parçası olarak tanımlanabilir. Üstelik, dinleyici işlevlerinin mutlaka
handleEvent()
olarak adlandırılması gerekmez—herhangi bir geçerli tanımlayıcı ile adlandırılabilir. ActionScript 3.0'da, gerçek dinleyici işlevinin adını kaydedersiniz.
Bir sınıfın dışında tanımlanan dinleyici işlevi
Şu kod, kırmızı bir kare şeklini görüntüleyen basit bir SWF dosyası oluşturur. Bir sınıfın parçası olmayan
clickHandler()
adında bir dinleyici işlevi, kırmızı kare üzerindeki fare tıklatma olaylarını dinler.
package
{
import flash.display.Sprite;
public class ClickExample extends Sprite
{
public function ClickExample()
{
var child:ChildSprite = new ChildSprite();
addChild(child);
}
}
}
import flash.display.Sprite;
import flash.events.MouseEvent;
class ChildSprite extends Sprite
{
public function ChildSprite()
{
graphics.beginFill(0xFF0000);
graphics.drawRect(0,0,100,100);
graphics.endFill();
addEventListener(MouseEvent.CLICK, clickHandler);
}
}
function clickHandler(event:MouseEvent):void
{
trace("clickHandler detected an event of type: " + event.type);
trace("the this keyword refers to: " + this);
}
Kullanıcı, kareyi tıklatarak sonuçta elde edilen SWF dosyasıyla etkileşim kurduğunda, Flash Player veya AIR şu iz çıktısını oluşturur:
clickHandler detected an event of type: click
the this keyword refers to: [object global]
Olay nesnesinin
clickHandler()
öğesine bir argüman olarak iletildiğine dikkat edin. Bu, dinleyici işlevinizin olay nesnesini incelemesine olanak sağlar. Bu örnekte, olayın bir tıklatma olayı olduğundan emin olmak için olay nesnesinin
type
özelliğini kullanırsınız.
Bu örnek ayrıca
this
anahtar sözcüğünün değerini de kontrol eder. Bu durumda,
this
öğesi, genel nesneyi temsil eder; işlev herhangi bir özel sınıf veya nesne dışında tanımlandığından bu akıllıcadır.
Sınıf yöntemi olarak tanımlanan dinleyici işlevi
Aşağıdaki örnek, ClickExample sınıfını tanımlayan bir önceki örnekle aynıdır; tek farkı
clickHandler()
işlevinin, ChildSprite sınıfının bir yöntemi olarak tanımlanmasıdır:
package
{
import flash.display.Sprite;
public class ClickExample extends Sprite
{
public function ClickExample()
{
var child:ChildSprite = new ChildSprite();
addChild(child);
}
}
}
import flash.display.Sprite;
import flash.events.MouseEvent;
class ChildSprite extends Sprite
{
public function ChildSprite()
{
graphics.beginFill(0xFF0000);
graphics.drawRect(0,0,100,100);
graphics.endFill();
addEventListener(MouseEvent.CLICK, clickHandler);
}
private function clickHandler(event:MouseEvent):void
{
trace("clickHandler detected an event of type: " + event.type);
trace("the this keyword refers to: " + this);
}
}
Kullanıcı, kırmızı kareyi tıklatarak sonuçta elde edilen SWF dosyasıyla etkileşim kurduğunda, Flash Player veya AIR şu iz çıktısını oluşturur:
clickHandler detected an event of type: click
the this keyword refers to: [object ChildSprite]
this
anahtar sözcüğünün
child
adında ChildSprite örneğini ifade ettiğini unutmayın. Bu, ActionScript 2.0'daki davranışta gerçekleşen bir değişikliktir. ActionScript 2.0'daki bileşenleri kullandıysanız,
UIEventDispatcher.addEventListener()
öğesine bir sınıf yöntemi iletildiğinde, yöntem kapsamının, dinleyici yönteminin tanımlandığı sınıf ile değil, olayı yayınlayan bileşenle sınırlı olduğunu hatırlayabilirsiniz. Başka bir deyişle, ActionScript 2.0'da bu tekniği kullandıysanız,
this
anahtar sözcüğü, ChildSprite örneğini değil, olayı yayınlayan bileşeni ifade eder.
Dinleyici yöntemini içeren diğer sınıf yöntemlerine ve özelliklerine erişemedikleri anlamına geldiğinden, bazı programcılar için bu önemli bir sorundu. Geçici bir çözüm olarak, ActionScript 2.0 programcıları dinleyici yönteminin kapsamını değiştirmek için
mx.util.Delegate
sınıfını kullanabiliyordu. Ancak ActionScript 3.0,
addEventListener()
çağrıldığında bir sınır oluşturduğundan artık buna gerek kalmamıştır. Sonuç olarak,
this
anahtar sözcüğü
child
adındaki ChildSprite örneğini ifade eder ve programcı, ChildSprite sınıfının diğer yöntemlerine ve özelliklerine erişim kazanır.
Kullanılmaması gereken olay dinleyicisi
Atanmış dinleyici işlevini dinamik olarak işaret eden bir özellik ile genel bir nesne oluşturduğunuz üçüncü bir teknik daha vardır ancak bu teknik önerilmez. ActionScript 2.0'da yaygın olarak kullanıldığından bu teknik burada ele alınmıştır, ancak ActionScript 3.0'da bu tekniğin kullanılmaması gerekir.
this
anahtar sözcüğü dinleyici nesne yerine genel nesneyi ifade edeceğinden bu teknik önerilmez.
Aşağıdaki örnek, önceki ClickExample sınıfıyla aynıdır, tek farkı, dinleyici işlevinin
myListenerObj
adında genel bir nesnenin parçası olarak tanımlanmasıdır:
package
{
import flash.display.Sprite;
public class ClickExample extends Sprite
{
public function ClickExample()
{
var child:ChildSprite = new ChildSprite();
addChild(child);
}
}
}
import flash.display.Sprite;
import flash.events.MouseEvent;
class ChildSprite extends Sprite
{
public function ChildSprite()
{
graphics.beginFill(0xFF0000);
graphics.drawRect(0,0,100,100);
graphics.endFill();
addEventListener(MouseEvent.CLICK, myListenerObj.clickHandler);
}
}
var myListenerObj:Object = new Object();
myListenerObj.clickHandler = function (event:MouseEvent):void
{
trace("clickHandler detected an event of type: " + event.type);
trace("the this keyword refers to: " + this);
}
İzleme sonuçları şöyle görünür:
clickHandler detected an event of type: click
the this keyword refers to: [object global]
this
öğesinin
myListenerObj
öğesini ifade etmesini ve izleme çıktısının
[object Object]
olmasını beklersiniz ancak bu genel nesneyi ifade eder.
addEventListener()
öğesine argüman olarak dinamik bir özellik adı ilettiğinizde, Flash Player veya AIR uygulaması bir sınır yöntemi oluşturamaz. Bunun nedeni,
listener
parametresi olarak ilettiğiniz şeyin, dinleyici işlevinizin bellek adresinden başka bir şey olmaması ve Flash Player ve AIR uygulamasının, bu bellek adresini
myListenerObj
örneğiyle bağlamasının bir yolu olmamasıdır
.
Olay dinleyicilerini yönetme
IEventDispatcher arabiriminin yöntemlerini kullanarak dinleyici işlevlerinizi yönetebilirsiniz. IEventDispatcher arabirimi, DOM olay modelinin EventTarget arabiriminin ActionScript 3.0 sürümüdür. IEventDispatcher adı, ana amacının olay nesnelerini göndermek olduğunu ima etse de, bu sınıfın yöntemleri, olay nesnelerini kaydetmek, olay dinleyicilerini kontrol etmek ve olay dinleyicilerini kaldırmak için çok daha sık kullanılır. IEventDispatcher arabirimi, aşağıdaki kodda gösterildiği gibi beş yöntemi tanımlar:
package flash.events
{
public interface IEventDispatcher
{
function addEventListener(eventName:String,
listener:Object,
useCapture:Boolean=false,
priority:Integer=0,
useWeakReference:Boolean=false):Boolean;
function removeEventListener(eventName:String,
listener:Object,
useCapture:Boolean=false):Boolean;
function dispatchEvent(eventObject:Event):Boolean;
function hasEventListener(eventName:String):Boolean;
function willTrigger(eventName:String):Boolean;
}
}
Flash Player API'si, olay hedefleri veya olay akışının parçası olabilen tüm sınıflar için temel sınıf görevi gören EventDispatcher sınıfı ile IEventDispatcher arabirimini uygular. Örneğin, DisplayObject sınıfı, EventDispatcher sınıfından miras alır. Başka bir deyişle, görüntüleme listesindeki herhangi bir nesne, IEventDispatcher arabiriminin yöntemlerine erişime sahiptir.
Olay dinleyicileri ekleme
addEventListener()
yöntemi, IEventDispatcher arabiriminin en etkin öğesidir. Dinleyici işlevlerinizi kaydetmek için bunu kullanırsınız.
type
ve
listener
iki zorunlu parametredir. Olayın türünü belirtmek için
type
parametresini kullanırsınız. Olay gerçekleştiğinde çalıştırılacak dinleyici işlevini belirtmek için
listener
parametresini kullanırsınız.
listener
parametresi bir işlev veya sınıf yöntemine başvuru olabilir.
listener
parametresini belirtirken parantez kullanmayın. Örneğin, aşağıdaki
addEventListener()
yöntemine yapılan çağrıda,
clickHandler()
işlevi parantez olmadan belirtilmiştir:
addEventListener(MouseEvent.CLICK, clickHandler)
addEventListener()
yönteminin
useCapture
parametresi, dinleyicinizin etkin olacağı olay akışı aşamasını denetlemenize olanak sağlar.
useCapture
öğesi
true
değerine ayarlanırsa, olay akışının yakalama aşaması sırasında dinleyiciniz etkin olur.
useCapture
öğesi
false
değerine ayarlanırsa, olay akışının köpürme aşaması sırasında dinleyiciniz etkin olur. Olay akışının tüm aşamaları sırasında bir olayı dinlemek için, bir kez
useCapture
true
değerine ayarlıyken ve daha sonra da bir kez
useCapture
false
değerine ayarlıyken
addEventListener()
öğesini iki defa çağırmanız gerekir.
addEventListener()
yönteminin
priority
parametresi, DOM Düzey 3 olay modelinin resmi bir parçası değildir. Bu, olay dinleyicilerinizi organize etmenizde size daha fazla esneklik sağlamak üzere ActionScript 3.0'a dahil edilmiştir.
addEventListener()
öğesini çağırdığınızda,
priority
parametresi olarak bir tam sayı değeri ileterek o olay dinleyicisi için önceliği ayarlayabilirsiniz. Varsayılan değer 0'dır ancak siz bunu negatif veya pozitif tam sayı değerlerine ayarlayabilirsiniz. Sayı ne kadar yükselirse, olay dinleyicisi o kadar önce çalıştırılır. Aynı önceliğe sahip olay dinleyicileri, eklendikleri sırayla çalıştırılır, bu nedenle dinleyici ne kadar önce eklenirse, o kadar önce çalıştırılır.
useWeakReference
parametresi, dinleyici işlevine başvurunun zayıf mı yoksa normal mi olduğunu belirtmenize olanak sağlar. Bu parametrenin
true
değerine ayarlanması, dinleyici işlevlerinin ihtiyaç duyulmadığı halde bellekte kalmaya devam ettiği durumları önlemenize olanak sağlar. Flash Player ve AIR uygulaması, artık kullanılmayan nesneleri bellekten temizlemek için
çöp toplama
adı verilen bir tekniği kullanır. Bir nesneye herhangi bir başvuru yoksa, o nesne artık kullanılmıyor olarak değerlendirilir. Çöp toplayıcı, zayıf başvuruları yok sayar, başka bir deyişle, bir dinleyici işlevi kendisini işaret eden yalnızca bir zayıf başvuruya sahipse, çöp toplama için uygun demektir.
Olay dinleyicilerini kaldırma
Artık ihtiyacınız olmayan bir olay dinleyicisini kaldırmak için
removeEventListener()
yöntemini kullanabilirsiniz. Artık kullanılmayacak olan olay dinleyicilerinin tümünü kaldırmak yararlı olacaktır. Gerekli parametreler
eventName
ve
listener
parametrelerini içerir, bunlar
addEventListener()
yöntemi için gereken parametrelerle aynıdır. Bir kez
useCapture
true
değerine ayarlıyken ve daha sonra tekrar
false
değerine ayarlıyken toplamda iki defa
addEventListener()
öğesini çağırarak tüm olay aşamaları sırasında olayları dinleyebileceğinizi unutmayın. Her iki olay dinleyicisini de kaldırmak için, bir kez
useCapture
true
değerine ayarlıyken ve daha sonra tekrar
false
değerine ayarlıyken toplam iki defa
removeEventListener()
öğesini çağırmanız gerekir.
Olaylar gönderme
dispatchEvent()
yöntemi, olay akışına özel bir olay nesnesi göndermek için ileri düzey programcılar tarafından kullanılabilir. Bu yöntem tarafından kabul edilen tek parametre, Event sınıfının veya Event sınıfının bir alt sınıfının örneği olması gereken bir olay nesnesine başvurudur. Gönderildikten sonra, olay nesnesinin
target
özelliği,
dispatchEvent()
öğesinin çağrıldığı nesneye ayarlanır.
Mevcut olay dinleyicilerini kontrol etme
IEventDispatcher arabiriminin son iki yöntemi, olay dinleyicilerinin varlığı hakkında yararlı bilgiler sağlar. Belirli bir görüntüleme nesnesindeki belirli bir olay türü için bir olay dinleyicisi bulunursa,
hasEventListener()
yöntemi
true
değerini döndürür. Ayrıca belirli bir görüntüleme listesi nesnesi için bir dinleyici bulunursa da
willTrigger()
yöntemi
true
değerini döndürür, ancak
willTrigger()
öğesi yalnızca o görüntüleme nesnesinde değil, olay akışının tüm aşamaları için o görüntüleme listesi nesnesinin tüm üst öğelerinde de dinleyicileri kontrol eder.
Dinleyicisi olmayan Error olayları
ActionScript 3.0'da hata işleme için birincil mekanizma, olaylar değil istisnalardır ancak dosya yükleme gibi senkronize olmayan işlemler için istisna işleme çalışmaz. Böyle bir senkronize olmayan işlem sırasında bir hata oluşursa, Flash Player ve AIR uygulaması bir hata olayı nesnesi gönderir. Hata olayı için bir dinleyici oluşturmazsanız, Flash Player ve AIR uygulamasının hata ayıklayıcı sürümü, hata hakkındaki bilgileri içeren bir iletişim kutusu getirir. Örneğin, Flash Player uygulamasının hata ayıklayıcı sürümü, uygulama geçersiz bir URL'den dosya yüklemeye çalıştığında hatayı açıklayan şu iletişim kutusunu oluşturur:
Çoğu hata olayı, ErrorEvent sınıfını esas alır ve bu nedenle, Flash Player veya AIR uygulamasının görüntülediği hata mesajını saklamak için kullanılan
text
adında bir özelliğe sahiptir. StatusEvent ve NetStatusEvent sınıfları iki istisnadır. Bu sınıfların her ikisi de bir
level
özelliğine (
StatusEvent.level
ve
NetStatusEvent.info.level
) sahiptir.
level
özelliğinin değeri "
error
" olduğunda, bu olay türleri hata olayları olarak değerlendirilir.
Bir hata olayı, SWF dosyasının çalışmasını durdurmaz. Yalnızca tarayıcı eklentilerinin ve bağımsız oynatıcıların hata ayıklayıcı sürümünde bir iletişim kutusu olarak, geliştirme oynatıcısındaki çıktı panelinde bir mesaj olarak ve Adobe Flash Builder'ın günlük dosyasında bir giriş olarak bildirilir. Flash Player veya AIR uygulamalarının yayınlama sürümlerinde ise bu bildirilmez.
|
|
|