Olay işleme örneği: Çalar Saat

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

Alarm Clock örneği, kullanıcının alarm çalacağı bir saat belirtmesine ve o anda bir mesajın görüntülenmesine olanak sağlayan bir saatten oluşur. Alarm Clock örneği, Tarih ve saatlerle çalışma bölümündeki SimpleClock uygulamasına dayanır. Alarm Clock, arasında şunların yer aldığı, ActionScript 3.0'daki olaylarla çalışmanın bir çok yönünü gösterir:

  • Bir olayı dinleme ve yanıtlama

  • Dinleyicilere bir olayı bildirme

  • Özel bir olay türü oluşturma

Bu örneğin Flash Professional uygulama dosyalarını edinmek için bkz. www.adobe.com/go/learn_programmingAS3samples_flash_tr. Bu örneğin Flex uygulama dosyalarını edinmek için bkz. http://www.adobe.com/go/as3examples_tr. Alarm Clock uygulama dosyaları, Samples/AlarmClock klasöründe bulunabilir. Uygulama şu dosyaları içerir:

File

Açıklama

AlarmClockApp.mxml

veya

AlarmClockApp.fla

Flash (FLA) veya Flex (MXML) içindeki ana uygulama dosyası.

com/example/programmingas3/clock/AlarmClock.as

SimpleClock sınıfını genişleterek çalar saat işlevi ekleyen bir sınıf.

com/example/programmingas3/clock/AlarmEvent.as

AlarmClock sınıfının alarm olayı için olay nesnesi görevi gören özel bir olay sınıfı (flash.events.Event öğesinin alt sınıfı).

com/example/programmingas3/clock/AnalogClockFace.as

Saati esas alarak yuvarlak bir saat yüzü, akrep, yelkovan ve saniye göstergesi çizer. (SimpleClock örneğinde açıklanmıştır.)

com/example/programmingas3/clock/SimpleClock.as

Basit zaman tutma işlevine sahip bir saat arabirimi bileşeni. (SimpleClock örneğinde açıklanmıştır.)

Alarm Clock öğesine genel bakış

Bu örnekte, zamanı izleme ve saat yüzünü görüntüleme dahil olmak üzere, saatin birincil işlevi, Tarih ve saat örneği: Basit analog saat bölümünde açıklanan SimpleClock uygulama kodunu yeniden kullanır. AlarmClock sınıfı, alarm saatini ayarlama ve alarm "çaldığında" bildirim sağlama gibi çalar saat için gerekli işlevleri ekleyerek bu örnekteki SimpleClock sınıfını genişletir.

Bir şey gerçekleştiğinde bildirim sağlamak, olayların asıl işidir. AlarmClock sınıfı, istenen eylemleri gerçekleştirmek için diğer nesnelerin dinleyebildiği Alarm olayını kullanıma sunar. Ayrıca AlarmClock sınıfı, alarmını ne zaman tetikleyeceğini belirlemek için Timer sınıfının bir örneğini kullanır. AlarmClock sınıfı gibi, Timer sınıfı da belirli bir süre geçtiğinde diğer nesnelere (bu durumda bir AlarmClock örneği) bildirim göndermek için bir olay sağlar. Çoğu ActionScript uygulamasında olduğu gibi, olaylar, Alarm Clock örnek uygulaması işlevinin önemli bir parçasını oluşturur.

Alarmı tetikleme

Önceden de belirtildiği gibi, AlarmClock sınıfının gerçekten sağladığı tek işlev, alarmın ayarlanması ve tetiklenmesiyle ilgilidir. Yerleşik Timer sınıfı (flash.utils.Timer), geliştiricinin belirtilen bir süre geçtikten sonra çalıştırılacak kod tanımlaması için bir yol sağlar. AlarmClock sınıfı, alarmın ne zaman verileceğini belirlemek için bir Timer örneği kullanır.

    import flash.events.TimerEvent; 
    import flash.utils.Timer; 
 
    /** 
     * The Timer that will be used for the alarm. 
     */ 
    public var alarmTimer:Timer; 
    ... 
    /** 
     * Instantiates a new AlarmClock of a given size. 
     */ 
    public override function initClock(faceSize:Number = 200):void 
    { 
        super.initClock(faceSize); 
        alarmTimer = new Timer(0, 1); 
        alarmTimer.addEventListener(TimerEvent.TIMER, onAlarm); 
    }

AlarmClock sınıfında tanımlanan Timer örneği, alarmTimer olarak adlandırılır. AlarmClock örneği için gerekli kurulum işlemlerini gerçekleştiren initClock() yöntemi, alarmTimer değişkeniyle iki şey yapar. İlk olarak, Timer örneğine 0 milisaniye beklemesini ve yalnızca bir defa zamanlayıcı olayını tetiklemesini bildiren parametrelerle değişken başlatılır. alarmTimer başlatıldıktan sonra kod, değişkenin timer olayını dinlemek istediğini belirtmek için değişkenin addEventListener() yöntemini çağırır. Timer örneği, belirtilen bir süre geçtikten sonra timer olayını göndererek çalışır. AlarmClock sınıfının, kendi alarmını vermesi için timer olayının ne zaman gönderildiğini bilmesi gerekir. AlarmClock kodu, addEventListener() öğesini çağırarak, alarmTimer ile bir dinleyici olarak kendisini kaydeder. Bu iki parametre, AlarmClock öğesinin timer olayını (TimerEvent.TIMER sabitiyle belirtilen) dinlemek istediğini ve olay gerçekleştiğinde, olaya yanıt olarak AlarmClock sınıfının onAlarm() yönteminin çağrılması gerektiğini belirtir.

Gerçekten alarmı ayarlamak için, şu şekilde AlarmClock sınıfının setAlarm() yöntemi çağrılır:

    /** 
     * Sets the time at which the alarm should go off. 
     * @param hour The hour portion of the alarm time. 
     * @param minutes The minutes portion of the alarm time. 
     * @param message The message to display when the alarm goes off. 
     * @return The time at which the alarm will go off. 
     */ 
    public function setAlarm(hour:Number = 0, minutes:Number = 0, message:String = "Alarm!"):Date 
    { 
        this.alarmMessage = message; 
        var now:Date = new Date(); 
        // Create this time on today's date. 
        alarmTime = new Date(now.fullYear, now.month, now.date, hour, minutes); 
 
        // Determine if the specified time has already passed today. 
        if (alarmTime <= now) 
        { 
            alarmTime.setTime(alarmTime.time + MILLISECONDS_PER_DAY); 
        } 
     
        // Stop the alarm timer if it's currently set. 
        alarmTimer.reset(); 
        // Calculate how many milliseconds should pass before the alarm should 
        // go off (the difference between the alarm time and now) and set that 
        // value as the delay for the alarm timer. 
        alarmTimer.delay = Math.max(1000, alarmTime.time - now.time); 
        alarmTimer.start(); 
     
        return alarmTime; 
    }

Bu yöntem, alarm mesajını saklama ve alarmın verileceği gerçek anı temsil eden bir Date nesnesi (alarmTime) oluşturma dahil olmak üzere, birçok şeyi gerçekleştirir. Şu an ele alınan konu içinde en önemlisi, yöntemin son birkaç satırında alarmTimer değişkeninin zamanlayıcısının ayarlanması ve etkinleştirilmesidir. İlk olarak, reset() yöntemi çağrılarak zamanlayıcı durdurulur ve önceden çalışıyor olma ihtimaline karşı sıfırlanır. Daha sonra, alarm verilmeden önce kaç milisaniye geçmesi gerektiğini belirlemek için, alarmTime değişkeninin değerinden geçerli zaman (now değişkeni tarafından temsil edilen) çıkarılır. Timer sınıfı timer olayını mutlak bir zamanda tetiklemez, bu nedenle de bu, alarmTimer öğesinin delay özelliğine atanan göreceli zaman farkıdır. Son olarak, zamanlayıcıyı gerçekten başlatmak için start() yöntemi çağrılır.

Belirtilen süre geçtikten sonra, alarmTimer öğesi timer olayını gönderir. AlarmClock sınıfı, onAlarm() yöntemini o olay için bir dinleyici olarak kaydettiğinden, timer olayı gerçekleştiğinde onAlarm() çağrılır.

    /** 
     * Called when the timer event is dispatched. 
     */ 
    public function onAlarm(event:TimerEvent):void  
    { 
        trace("Alarm!"); 
        var alarm:AlarmEvent = new AlarmEvent(this.alarmMessage); 
        this.dispatchEvent(alarm); 
    }

Olay dinleyicisi olarak kaydedilen bir yöntemin uygun imza (başka bir deyişle, yöntemin parametreler kümesi ve döndürme türü) ile tanımlanması gerekir. Bir yöntemin, Timer sınıfının timer olayına yönelik bir dinleyici olması için, Event sınıfının bir alt sınıfı olan TimerEvent (flash.events.TimerEvent) veri türüne sahip bir parametre tanımlaması gerekir. Timer örneği, olay dinleyicilerini çağırdığında, olay nesnesi olarak bir TimerEvent örneği iletir.

Diğerlerine alarmı bildirme

Timer sınıfı gibi, AlarmClock sınıfı da, alarm verildiğinde diğer kodun bildirim almasına olanak veren bir olay sağlar. Bir sınıfın ActionScript'te yerleşik olay işleme çerçevesini kullanması için, o sınıfın flash.events.IEventDispatcher arabirimini uygulaması gerekir. Daha yaygın olarak bu, flash.events.EventDispatcher sınıfı genişletilerek (veya EventDispatcher’ın alt sınıfları genişletilerek) yapılır, böylece IEventDispatcher öğesinin standart bir uygulaması sağlanır. Daha önce açıklandığı gibi, AlarmClock sınıfı SimpleClock sınıfını genişletir, ve bu da EventDispatcher sınıfını (bir miras zinciri üzerinden) genişletir. Tüm bunlar, AlarmClock sınıfının kendi olaylarını sağlamak için yerleşik işlevlere önceden sahip olduğu anlamına gelir.

Diğer kod, AlarmClock öğesinin EventDispatcher öğesinden miras aldığı addEventListener() yöntemini çağırarak AlarmClock sınıfının alarm olayının kendisine bildirilmesi için kaydolabilir. Bir AlarmClock örneği, alarm olayının verildiğini diğer koda bildirmeye hazır olduğunda, yine EventDispatcher öğesinden miras alınan dispatchEvent() yöntemini çağırarak bunu yapar.

        var alarm:AlarmEvent = new AlarmEvent(this.alarmMessage); 
        this.dispatchEvent(alarm);

Bu kod satırları, AlarmClock sınıfının onAlarm() yönteminden (önceden tamamı gösterilen) alınır. AlarmClock örneğinin dispatchEvent() yöntemi çağrılır, daha sonra bu yöntem, tüm kayıtlı dinleyicilere AlarmClock örneğinin alarm olayının tetiklendiğini bildirir. dispatchEvent() öğesine iletilen parametre, dinleyici yöntemlerine iletilecek olay nesnesidir. Bu durumda, bu örnek için özel olarak oluşturulmuş bir Event alt sınıfı olan AlarmEvent sınıfının bir örneğidir.

Özel bir alarm olayı sağlama

Tüm olay dinleyicileri, tetiklenmekte olan belirli bir olay hakkında bilgilerin yer aldığı bir olay nesnesi parametresi alır. Çoğu durumda olay nesnesi, Event sınıfının bir örneğidir. Ancak bazı durumlarda da, olay dinleyicilerine ek bilgi sağlanması yararlı olacaktır. Bunu gerçekleştirmenin yaygın bir yolu, yeni bir sınıfın, Event sınıfının bir alt sınıfının tanımlanması ve olay nesnesi olarak bu sınıfın bir örneğinin kullanılmasıdır. Bu örnekte, AlarmClock sınıfının alarm olayı gönderildiğinde bir AlarmEvent örneği olay nesnesi olarak kullanılır. Burada gösterilen AlarmEvent sınıfı, alarm olayı hakkında, özellikle de alarm mesajı hakkında ek bilgiler sağlar:

    import flash.events.Event; 
     
    /** 
     * This custom Event class adds a message property to a basic Event. 
     */ 
    public class AlarmEvent extends Event  
    { 
        /** 
         * The name of the new AlarmEvent type. 
         */ 
        public static const ALARM:String = "alarm"; 
         
        /** 
         * A text message that can be passed to an event handler 
         * with this event object. 
         */ 
        public var message:String; 
         
        /** 
         *Constructor. 
         *@param message The text to display when the alarm goes off. 
         */ 
        public function AlarmEvent(message:String = "ALARM!") 
        { 
            super(ALARM); 
            this.message = message; 
        } 
        ... 
    }

Özel bir olay nesnesi sınıfı oluşturmanın en iyi yolu, önceki örnekte gösterildiği gibi, Event sınıfını genişleten bir sınıfın tanımlanmasıdır. AlarmEvent sınıfı, miras alınan işlevleri tamamlamak için, olayla ilişkilendirilmiş alarm mesajının metnini içeren bir message özelliğini tanımlar; message değeri, AlarmEvent yapıcısında bir parametre olarak iletilir. AlarmEvent sınıfı ayrıca AlarmClock sınıfının addEventListener() yöntemi çağrıldığında belirli bir olayı (alarm) ifade etmek için kullanılabilen ALARM sabitini de tanımlar.

Her Event alt sınıfının, özel işlevler eklemenin yanı sıra ActionScript olay işleme çerçevesinin parçası olarak miras alınan clone() yöntemini geçersiz kılması da gerekir. Ayrıca Event alt sınıfları, toString() yöntemi çağrıldığında döndürülen değere özel olayın özelliklerini dahil etmek için, miras alınan toString() yöntemini isteğe bağlı olarak geçersiz kılabilir.

    /** 
     * Creates and returns a copy of the current instance. 
     * @return A copy of the current instance. 
     */ 
    public override function clone():Event 
    { 
        return new AlarmEvent(message); 
    } 
     
    /** 
     * Returns a String containing all the properties of the current 
     * instance. 
     * @return A string representation of the current instance. 
     */ 
    public override function toString():String 
    { 
        return formatToString("AlarmEvent", "type", "bubbles", "cancelable", "eventPhase", "message"); 
    }

Geçersiz kılınan clone() yönteminin, tüm özel özellikleri geçerli örnekle eşleşecek şekilde ayarlanmış olarak özel Event alt sınıfının yeni bir örneğini döndürmesi gerekir. Geçersiz kılınmış toString() yönteminde, özel türün adını ve tüm özelliklerinin adlarını ve değerlerini içeren bir dize sağlamak için formatToString() yardımcı program yöntemi (Event öğesinden miras alınan) kullanılır.