Создание анимированных часов


Здравствуйте. Порой перед программистом стоит цель, написать
отображение часов с использованием изображений. В данном рассмотренном  примере мы пытались доступно показать как это
реализовать средствами j2me CLDC 1.0 и MIDP 1.0. В программе используются изображения
при помощи Adobe Photoshop'а, в примере представлен полностью работоспособный
исходный код.

import javax.microedition.lcdui.Display;
import javax.microedition.midlet.MIDlet;
public class mainMidlet extends MIDlet {
  Display disp;
  public void startApp() {
    disp = Display.getDisplay(this);
    draw drawClock = new draw();// вызываем класс draw() отвечающий за отображение часов
    disp.setCurrent(drawClock);
  }
  public void pauseApp() {}
  public void destroyApp(boolean b) {}
}


Класс TimerCod
берет часы, минуты и секунды с телефона и присваивает их в int переменные:

 

import java.util.Calendar;
public class TimerCod {
  public int hour;
  public int min;
  public int sec;
  public void time() {
    Calendar cal = Calendar.getInstance();
    hour = cal.get(11);//часы
    min = cal.get(12);//минуты
    sec = cal.get(13);//секунды
  }
}


А вот и главный код отображающий и переводящий числа в
изображения:

 

 

import java.io.IOException; // Исключение вывода изображений
import javax.microedition.lcdui.*; // Канва
class draw extends Canvas implements Runnable {
  private boolean openclockThr = true; //булева для открытия потока
  private Image img[] = new Image[10]; //массив изображений цифр
  private Image displayIm; // картинка жк. дисплея
  private Image tochki; //картинка точек на дисплее
  private Thread thr = new Thread(this); // Поток отвечающий за работу часов
  private int hour, minu, secu; // Для принятия данных из класса TimerCod
  private int h_1 = 0, h_2 = 0, m_1, m_2, s_1 = 0, s_2 = 0;
  private TimerCod timer = new TimerCod(); // вызов класса TimerCod
  private String getSec_int_to_str = ""//  используется в методе translator()
  private String getHour_int_to_str = ""//  используется в методе translator()
  private String getMin_int_to_str = ""//  используется в методе translator()
  private String hour_str_1, hour_str_2, minute_str_1, // Стринги используемые в методе translator()
  minute_str_2, secunde_str_1, secunde_str_2;
  private char hour_array[] = new char[2]; // массив для принятия данных часов
  private char minute_array[] = new char[2]; // массив для принятия данных минут
  private char secunde_array[] = new char[2]; // массив для принятия данных секунд
  public draw() {
    timer.time(); // вызываем класс TimerCod и метод time()
    hour = timer.hour; //присваиваем часы
    minu = timer.min; //присваиваем минуты
    secu = timer.sec; //присваиваем секунды
    for (int i = 0; i <= 9; i++) {
      try {
        img[i] = Image.createImage("/num/" + i + ".PNG"); //Грузим картинки цифр для часов
      catch (IOException ex) {
        System.out.println("Image not loading");
      }
    }
    try {
      displayIm = Image.createImage("/num/display.PNG"); //берем картинкм из папки
      tochki = Image.createImage("/num/tochki.PNG");
    } catch (IOException ex1) {
      System.out.println("Image not loading");
    }
    thr.start(); // Стартуем поток отвесающий за обновления часов
  }
  public void translator() { //Главный метод отвечающий за изменение изменение времени
    if (secu < 59) { // Ставим ограничение на секунды
      secu++;
    } else {
      secu = 0;
      if (minu < 59) { // Ставим ограничение на минуты
        minu += 1;
      } else {
        minu = 0;
        if (hour < 23) { // Ставим ограничение на часы
          hour++;
        } else // в противном случае на все int переменые ставим значение 0
          hour = 0;
          minu = 0;
          secu = 0;
        }
      }
    }
    getHour_int_to_str = String.valueOf(hour); //Переводим int hour в string
    getMin_int_to_str = String.valueOf(minu); //Переводим int minu в string
    getSec_int_to_str = String.valueOf(secu); //Переводим int secu в string
    //--------------------------------------------------------------------------
    if (getHour_int_to_str.length() <= 1) { // Проверяем длину строки часов, так если часы, минуты, секуды меньше 10 часов то телефон дает однозначное значение
      h_1 = 0// Эта переменная пригодится для прорисовки цифр, отвечающая за вывод первой картинки часов
      h_2 = hour; //переменная пригодится для прорисовки второй картинки часов
    else {
      hour_array[0] = getHour_int_to_str.charAt(0); // берем из строки символ под индексом 0 и ложим в массив hour_array
      hour_array[1] = getHour_int_to_str.charAt(1); // берем из строки символ под индексом 1 и ложим в массив hour_array
      hour_str_1 = String.valueOf(hour_array[0]); // В следующую переменную строки засовываем символ под индексом 0 из массива hour_array
      hour_str_2 = String.valueOf(hour_array[1]); // далее засовываем символ под индексом 1 из массива hour_array
      h_1 = Integer.parseInt(hour_str_1); // В int h_1 переводим строку hour_str_1(далее h_1 исполдьзуется в методе paint())
      h_2 = Integer.parseInt(hour_str_2); // Эта соответсвенно также как у предыдущая переменная
    }
    //--------------------------------------------------------------------------
    if (getMin_int_to_str.length() <= 1) { // Проверяем длину строки минут, так если часы, минуты, секуды меньше 10 часов то телефон дает однозначное значение
      m_1 = 0// Эта переменная пригодится для прорисовки цифр, отвечающая за вывод первой картинки минут
      m_2 = minu; //переменная пригодится для прорисовки второй картинки минут
    else {
      minute_array[0] = getMin_int_to_str.charAt(0); // берем из строки символ под индексом 0 и ложим в массив minute_array
      minute_array[1] = getMin_int_to_str.charAt(1); // берем из строки символ под индексом 1 и ложим в массив minute_array
      minute_str_1 = String.valueOf(minute_array[0]); // В следующую переменную строки засовываем символ под индексом 0 из массива minute_array
      minute_str_2 = String.valueOf(minute_array[1]); // далее засовываем символ под индексом 1 из массива minute_array
      m_1 = Integer.parseInt(minute_str_1); // В int m_1 переводим строку minute_str_1(далее m_1 исполдьзуется в методе paint())
      m_2 = Integer.parseInt(minute_str_2); // Эта соответсвенно также как у предыдущая переменная
    }
    //--------------------------------------------------------------------------
    if (getSec_int_to_str.length() <= 1) { // Проверяем длину строки секунд, так если часы, минуты, секуды меньше 10 часов то телефон дает однозначное значение
      s_1 = 0// Эта переменная пригодится для прорисовки цифр, отвечающая за вывод первой картинки секунд
      s_2 = secu; //переменная пригодится для прорисовки второй картинки секунд
    else {
      secunde_array[0] = getSec_int_to_str.charAt(0); // берем из строки символ под индексом 0 и ложим в массив secunde_array
      secunde_array[1] = getSec_int_to_str.charAt(1); // берем из строки символ под индексом 1 и ложим в массив secunde_array
      secunde_str_1 = String.valueOf(secunde_array[0]); // В следующую переменную строки засовываем символ под индексом 0 из массива secunde_array
      secunde_str_2 = String.valueOf(secunde_array[1]); // далее засовываем символ под индексом 1 из массива secunde_array
      s_1 = Integer.parseInt(secunde_str_1); // В int s_1 переводим строку secunde_str_1(далее s_1 исполдьзуется в методе paint())
      s_2 = Integer.parseInt(secunde_str_2); // Эта соответсвенно также как у предыдущая переменная
    }
    //--------------------------------------------------------------------------
    repaint(); // идем в метод paint();
  }
  public void paint(Graphics g) {
    g.setColor(255255255); // Цвет для заливки заднего фона
    g.fillRect(00, g.getClipWidth(), g.getClipHeight()); // Заливаем область экрана белым цветом
    g.drawImage(displayIm, 10100); // отображаем жк
    g.drawImage(img[h_1], 20150); // часы 1-ую цифру
    g.drawImage(img[h_2], 30150); // часы 2-ую цифру
    g.drawImage(img[m_1], 50150); // минуты 1-ую цифру
    g.drawImage(img[m_2], 60150); // минуты 2-ую цифру
    g.drawImage(img[s_1], 80150); // секунды 1-ую цифру
    g.drawImage(img[s_2], 90150); // секунды 2-ую цифру
    g.drawImage(tochki, 40150); // точки между часами и минутами
    g.drawImage(tochki, 70150); //точки между минутами и секундами
  }
  public void run() {
    while (openclockThr == true) {
      try {
        Thread.sleep(1000); // Раз в секунду вызываем метод translator()
        translator(); // Вызываем метод "переводчик"
      catch (InterruptedException ex) {
      }
    }
  }
}


В конструкторе класса draw идет загрузка изображений из папки
находящейся в jar архиве.

 

Заключение

В этой статье была рассмотрена технология создания графических часов с
использованием стандартных средств
j2me.

Файлы
Clock.jad (0,2 Кб)  Clock.jar (42,6 Кб)