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.
|
|
|