Olay dinleyicileri

Flash Player 9 ve üstü, Adobe AIR 1.0 ve üstü

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 useCapturetrue değerine ayarlıyken ve daha sonra da bir kez useCapturefalse 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 useCapturetrue 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 useCapturetrue 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.