Пример даты и времени: простые аналоговые часы

Flash Player 9 и более поздних версий, Adobe AIR 1.0 и более поздних версий

Пример простых аналоговых часов иллюстрирует эти две концепции даты и времени:

  • получение текущей даты и времени и извлечение значений для часов, минут и секунд;

  • использовании класса Timer для задания ритма приложению.

    Получить файлы приложения для этого примера можно на странице www.adobe.com/go/learn_programmingAS3samples_flash_ru. Файлы приложения SimpleClock находятся в папке Samples/SimpleClock. Приложение состоит из следующих файлов.

    File

    Описание

    SimpleClockApp.mxml

    или

    SimpleClockApp.fla

    Основной файл приложения Flash (FLA) или Flex (MXML).

    com/example/programmingas3/simpleclock/SimpleClock.as

    Основной файл приложения.

    com/example/programmingas3/simpleclock/AnalogClockFace.as

    Рисует круглый циферблат с часовой, минутной и секундной стрелками.

Определение класса SimpleClock

Пример с часами очень прост, но полезно уметь грамотно работать и с простыми приложениями, чтобы в будущем понимать, как их можно усложнить и усовершенствовать. В приложении SimpleClock используется класс SimpleClock для обработки задач запуска и отсчета времени, а также еще один класс AnalogClockFace собственно для отображения времени.

Ниже приведен код для определения и инициализации класса SimpleClock (обратите внимание, что в варианте Flash класс SimpleClock является расширением класса Sprite):

public class SimpleClock extends UIComponent 
{ 
    /** 
     * The time display component. 
     */ 
    private var face:AnalogClockFace; 
     
    /** 
     * The Timer that acts like a heartbeat for the application. 
     */ 
    private var ticker:Timer;

У этого класса есть два важных свойства:

  • свойство face, являющееся экземпляром класса AnalogClockFace;

  • свойство ticker, являющееся экземпляром класса Timer.

    Класс SimpleClock использует конструктор по умолчанию. Метод initClock() отвечает за установку: создает циферблат и запускает экземпляр Timer.

Создание циферблата

В следующих строках кода SimpleClock создается циферблат для отображения времени:

    /** 
     * Sets up a SimpleClock instance. 
     */ 
    public function initClock(faceSize:Number = 200)  
    { 
        // creates the clock face and adds it to the display list 
        face = new AnalogClockFace(Math.max(20, faceSize)); 
        face.init(); 
        addChild(face); 
         
        // draws the initial clock display 
        face.draw();

Размер циферблата можно передать в методе initClock(). Если значение faceSize не передается, то размер по умолчанию составит 200 пикселов.

Затем приложение инициализирует циферблат и добавляет его к списку отображения с помощью метода addChild(), наследуемого от класса DisplayObjectContainer. Далее вызывается метод AnalogClockFace.draw(), который один раз отображает циферблат с текущим временем.

Запуск таймера

После создания циферблата метод initClock() настраивает таймер:

        // creates a Timer that fires an event once per second 
        ticker = new Timer(1000);  
     
        // designates the onTick() method to handle Timer events 
        ticker.addEventListener(TimerEvent.TIMER, onTick); 
 
        // starts the clock ticking 
        ticker.start();

Сначала этот метод создает экземпляр Timer, который будет отправлять событие каждую секунду (каждые 1000 миллисекунд). Так как конструктору Timer() не передается второй параметр repeatCount, Timer будет многократно повторяться.

Метод SimpleClock.onTick() будет выполняться раз в секунду при получении события timer:

    public function onTick(event:TimerEvent):void  
    { 
        // updates the clock display 
        face.draw(); 
    }

Метод AnalogClockFace.draw() просто рисует циферблат и стрелки.

Отображение текущего времени

Подавляющая часть кода в классе AnalogClockFace отвечает за создание на циферблате отображаемых элементов. При инициализации класса AnalogClockFace рисуется круг, внутри него рядом с каждой часовой меткой пишется число, а затем создаются три объекта Shape: один для часовой стрелки, один для минутной и один для секундной.

После запуска приложения SimpleClock каждую секунду вызывается метод AnalogClockFace.draw(), как показано ниже:

    /** 
     * Called by the parent container when the display is being drawn. 
     */ 
    public override function draw():void 
    { 
        // stores the current date and time in an instance variable 
        currentTime = new Date(); 
        showTime(currentTime); 
    }

Этот метод сохраняет значение текущего времени в переменной, чтобы время не изменилось в процессе отрисовки стрелок часов. Затем вызывается метод showTime(), который отображает стрелки часов, как показано ниже:

    /** 
     * Displays the given Date/Time in that good old analog clock style. 
     */ 
    public function showTime(time:Date):void  
    { 
        // gets the time values 
        var seconds:uint = time.getSeconds(); 
        var minutes:uint = time.getMinutes(); 
        var hours:uint = time.getHours(); 
 
        // multiplies by 6 to get degrees 
        this.secondHand.rotation = 180 + (seconds * 6); 
        this.minuteHand.rotation = 180 + (minutes * 6); 
 
        // Multiply by 30 to get basic degrees, then 
        // add up to 29.5 degrees (59 * 0.5) 
        // to account for the minutes. 
        this.hourHand.rotation = 180 + (hours * 30) + (minutes * 0.5); 
    }

Сначала этот метод извлекает значения часов, минут и секунд текущего времени. Затем эти значения используются для расчета угла каждой из стрелок. Так как секундная стрелка делает полный оборот за 60 секунд, ее угол каждую секунду меняется на 6 градусов (360/60). Минутная стрелка каждую минуту смещается на одинаковое количество градусов.

Часовая стрелка тоже меняет свое положение каждую минуту, чтобы отражать ход времени. Каждый час она смещается на 30 градусов (360/12), а каждую минуту — на полградуса (делим 30 градусов на 60 минут).