<< Пред.           стр. 18 (из 32)           След. >>

Список литературы по разделу

 gc.Clear();
 // выводим изображение на экране
 gc.DrawBitmap(TPoint(0, 0), iBitmap);
 }
  Для загрузки точечного рисунка нужно подключить две системные библиотеки aknutils.h и fbs.h. В функции ConstructL (), играющей роль конструктора, сначала происходит инициализация переменной KPath и впоследствии объекта bitmap класса TFileName, с названием и местонахождением сгенерированного файла МВМ. По идее, вы должны загружать в проект BMP-файл, который находится в папке проекта, но изначально в проекте происходит компиляция всех файлов ресурсов и изображений. В связи с этим наше изображение Bmp.bmp проекта ImageTest конвертируется в Testmbm, так, как было указано в файле ММР, и сохраняется в системной папке SDK в \system\apps\test\Test.bmp. С этого места и происходит его загрузка в программу уже с помощью функции CreateBitmapL (). Функция имеет два параметра. Первый - это объект bitmap класса TFileName, представляющий данные о загружаемом файле изображения. Второй параметр -это идентификатор изображения. У нас картинка одна, поэтому можно просто поставить значение 0. В функции Draw () происходит отображение загруженного файла с помощью функции DrawBitmap (). Первый параметр этой функции -точка в пространстве клиентской области экрана, определяющая положение левого верхнего угла изображения. У нас это значение равно (0, 0) - это начало координат или левый верхний угол клиентской области экрана. Второй параметр -
 
 объект iBitmap класса CFbsBitmap, представляющий конвертированный точечный рисунок формата МВМ. И последнее, что нужно сделать, - это обратиться к файлу Test.pkg проекта ImageTest, где надо указать путь к изображению, для того чтобы во время упаковки программы изображение так же было заархивировано в SIS-файл. Делается это следующим образом: "..\..\..\epoc32\data\z\system\apps\Test\Test.mbm"-"!:\system\apps\Test\Test.mbm"
  На рис. 9.10 показана загрузка изображения в программу ImageTest.
  Рис. 9.10. Работа программы ImageTest
  В следующей главе мы поговорим о Java 2 МЕ-про-граммировании в Symbian OS.
 
 Глава 10. Программирование Java приложений
 Операционная система Symbian в полной мере поддерживает работу Java-приложений. Среда исполнения Java-программ встроена в Symbian OS независимым модулем, тем самым, обеспечивая поддержку платформы Java 2 Micro Edition в смартфонах и коммуникаторах разных производителей.
  В этой книге мы только коснемся общих концепций построения Java 2 МЕ-программ на платформе Symbian OS, а так же рассмотрим некоторые моменты, связанные с графическим интерфейсом пользователя. Создание Java-программ для Symbian OS ничем не отличается от создания аналогичных программ для мобильных телефонов с поддержкой Java Издательством ДМК недавно была выпущена книга под названием "Программирование мобильных телефонов на Java 2 Micro Edition", в которой доступно объясняется полный этап создания Java 2 МЕ-программ под мобильные телефоны различных марок.
 10.1. Платформа Java 2 ME
  Технология Java, созданная компанией Sun Microsystems Inc., состоит из трех основных элементов:
 ? система времени исполнения;
 ? язык Java;
 ? библиотека Java API.
  Совокупность этих элементов и образует технологию Java, которая, в свою очередь, делится на три независимых друг от друга платформы:
 ? Java 2 Enterprise Edition;
 ? Java 2 Standard Edition;
 ? Java 2 Micro Edition.
  Платформы Java 2 ЕЕ и Java 2 SE предназначены для работы на серверных и персональных компьютерных системах, а платформа Java 2 ME подготовлена специально для работы на мобильных устройствах с ограниченными системными ресурсами. Мобильные телефоны, в отличие от мощных компьютерных систем, обладают куда меньшими системными характеристиками, a Java 2 ME прекрасно адаптирована для работы в мобильных устройствах. Надежность, компактность и архитектурная независимость платформы Java 2 ME послужили ее широкому распространению.
  Платформа Java 2 ME, как уже было упомянуто, состоит из системы времени выполнения, или виртуальной Java машины, языка программирования Java и на-
 
 бора библиотечных функций, необходимых при создании Java-программ. Работа Java-приложений построена на основе интерпретации, то есть при компиляции исходного кода программы создается виртуальный код, который при работе программы налету читается виртуальной Java-машиной, образуя тем самым среду времени исполнения Java-программ. Очевидно, что среда времени исполнения или виртуальная Java-машина должна быть встроена в телефон. Таким образом осуществляется поддержка платформы Java 2 ME производителями телефонов. Мобильные устройства, работающие на основании прошивки, на сегодняшний день в своем большинстве имеют поддержку Java 2 ME (об этом заботятся производители). Тогда как смартфоны и коммуникаторы, работающие под управлением операционной системы Symbian, имеют встроенную поддержку платформы Java 2 ME, осуществляемую самой Symbian OS, о чем позаботились уже системные программисты компании Symbian Ltd.
  Для разработчиков платформа Java 2 ME построена в виде блочной архитектуры надстраиваемых друг над другом модулей. Два основных модуля в Java 2 ME - это конфигурация CLDC (Connected Limited Device Configuration -конфигурация подключаемых устройств с ограничениями) и профиль MIDP (Mobile Information Device Profile - информационный профиль мобильных устройств). Профиль MIDP надстраивается над конфигурацией CLDC и именно в такой связке осуществляется разработка мобильных приложений для Symbian OS.
  Профиль MIDP и конфигурация CLDC - это жестко заданные спецификации, изменение ядра которых программисту недоступно. Конфигурация CLDC и профиль MIDP имеют по две версии:
 ? MIDP 1.0, MIDP 2.0;
 ? CLDC 1.0, CLDC 1.1.
 10.1.1. Конфигурация CLDC
  Две существующие версии CLDC отличаются не многим. Первая версия, CLDC 1.0, была доступна с самого начала создания платформы Java 2 ME, и на основе этой конфигурации выполнено 95% телефонов. Разница в двух конфигурациях минимальна, а очевидный единственный плюс новой версии, CLDC 1.1, -это поддержка чисел с плавающей точкой (дробные числа). Но пока конфигурация CLDC 1.1 насчитывает пару-тройку очень дорогих телефонов, поэтому пока рано ориентироваться на эту конфигурацию. Операционная система Symbian версии 6.1 поддерживает только конфигурацию CLDC 1.0, тогда как Symbian OS 7.0 поддерживает возможность работы с CLDC 1.1.
  Теперь о том, из чего состоит CLDC. Конфигурация CLDC создана крупной экспертной группой, в которую входят большинство производителей мобильных устройств. CLDC предъявляет ряд технических требований к телефонам, а именно:
 ? 16- или 32-разрядный процессор;
 ? минимум 160 Кб выделенной памяти под платформу Java 2ME;
 ?
 ? питание от аккумулятора;
 ? беспроводное сетевое соединение.
  Это минимальные системные требования для телефонов, поддерживающих технологию Java.
  В состав конфигурации CLDC входит виртуальная Java-машина, носящая название KVJ (Kilobait Virtual Machine) из-за своего маленького размера и ориентированности на мобильные устройства, а так же ряд пакетов из Java 2 SE, в усеченном виде:
 ? javalang;
 ? javautil;
 ? javaio.
  Так же предъявляются некоторые требования к свойствам языка, которые должны соответствовать самой спецификации языка Java.
 10.1.2. Профили MIDP
  Над конфигурацией надстраиваются профили, которые имеют две версии: MIDP 1.0 и MIDP 2.O. Два этих профиля построены на одной базе, но в профиле MIDP 2.0 содержится ряд дополнительных пакетов с набором новых интерфейсов, классов и констант, значительно улучшающих разработку Java-программ. Платформа Symbian OS версии 6.1 работает только с профилем MIDP 1.0, а поздняя версия Symbian OS 7.0 уже с версией MIDP 2.O.
  Профиль MIDP так же разработан экспертной группой, в составе которой множество производителей мобильных устройств. В конфигурации MIDP предъявляет свои минимальные технические требования к аппаратной части устройства:
 ? разрешение экрана от 96 х 54 пикселей;
 ? глубина экрана от 1 бита;
 ? 32 Кб динамической памяти;
 ? 128 Кб для Java компонентов;
 ? 8 Кб для хранения постоянных данных.
 Профиль MIDP 1.0 включает в себя следующие пакеты:
 ? javax.microedition.lcdui;
 ? javax.microedition.io;
 ? javax.microedition.pki;
 ? javax.microedition.midlet;
 ? javax.microedition.rms.
  В состав профиля MIDP 2.0 входят все вышеперечисленные пакеты из профиля MIDP 1.0 и еще три дополнительные пакета:
 ? javax.microedition.lcdui.game;
 ? javax.microedition.media;
 ? javax.microedition.mediacontrol.
  То есть профиль MIDP 2.0 является расширенной версией профиля MIDP 1.0.
 
  Вам как программисту наличие разных версий конфигураций и профилей добавляет лишнюю головную боль. Ряд телефонных аппаратов работают только с CLDC 1.0/MIDP 1.0, ряд с CLDC 1.0/MIDP 2.0, другие телефоны поддерживают CLDC 1.1/MIDP 2.0, что соответственно только усложняет разработку программ. При создании Java 2 МЕ-приложений надо следить за тем, какую из связок профиля и конфигурации планируется использовать. Иначе программа, написанная, например, под CLDC 1.1/MIDP 2.0, не сможет работать на устройстве, поддерживающем CLDC 1.0/MIDP 1.0. Поэтому при написании Java-программ под Symbian OS надо быть особенно внимательным и тщательно планировать разработку приложений. Выбор той или иной связки профиля и конфигурации происходит на этапе создания проекта в одной из интегрированных сред программирования приложений. И уже на основе выбранной связки конфигурации и профиля CLDC/MIDP будут доступны соответствующие API. Можно разграничить версии профилей и конфигураций следующим образом:
 ? Symbian OS 6.1 - CLDC 1.0/MIDP 1.0;
 ? Symbian OS 7.0 - CLDC 1.0/MIDP 2.0.
  В приложении 2 перечислены все имеющиеся мобильные телефоны, работающие под управлением Symbian OS с подробным описанием технических характеристик, и вы можете проследить поддержку того или иного профиля и конфигурации.
  Такая запутанная ситуация с CLDC/MIDP не добавляет оптимизма программисту, но технология Java 2 ME еще только развивается и это необходимо иметь в виду. Поэтому при изучении программирования телефонов на базе Symbian OS лучше ориентироваться на версии CLDC 1.0/MIDP 2.0 - это ближайшее будущее, которое наступит уже завтра.
  Полный перечень функциональных возможностей пакетов Java 2 ME можно найти на сайте компании Sun Microsystems по адресу: http://javasun.com или в справочнике книги "Программирование мобильных телефонов на Java 2 Micro Edition" издательства ДМК.
 10.2. Мидлет
  Приложение, созданное под платформу Java 2 ME, позиционируется как мидлет. Мидлет - это программа, написанная для мобильного телефона с использованием платформы Java 2 Micro Edition. Структура программ на Java 2 ME делится на основной класс мидлета, наследуемый от класса MIDlet пакета javax.microedi-tion.midlet.*, и вспомогательные классы, реализующие, как правило, системную логику программы. Основной класс мидлета - это сердце и мотор всего приложения, с него начинается работа всей программы. Конечно, при желании можно интегрировать создаваемые дополнительные классы и в исходный код основного класса мидлета, но язык программирования Java тем и хорош, что он объектно-ориентированный и все его лучшие качества именно в этом. Для каких-то демонстрационных примеров допустимо встраивание классов в основной класс мидлета, но в реальном приложении надо воздерживаться от такой модели построения программ.
 
  Основной класс мидлета, наследуемый от класса MlDlet, имеет три предопределенных метода, которые должны быть реализованы программистом:
 ? void startAppO - с помощью этого метода начинается работа мидлета,
 выражаясь абстрактно - это как зажигание в машине или точка отсчета
 программы;
 ? void pauseAppO - иногда требуется приостановить приложение на за
 данный промежуток времени, например, выход из программы на некото
 рое время, без закрытия приложения и возврат, а реализация этого метода
 дает такую возможность;
 ? void destroyApp() - если метод startAppO "зажигание", то этот
 метод "тормозная педаль" программы, то есть, реализовав этот метод, вы
 предопределяете логическое завершение работы всего приложения.
  После загрузки Java-приложения в телефон и его активизации происходит инициализация всех глобальных переменных программы, исполнение кода конструктора основного класса мидлета и поиск метода startAppO. Метод startApp () - отправная точка приложения, и с его работы начинается активизация Java-программы. Обычно метод startApp () содержит экземпляры сопутствующих классов приложения, осуществляя тем самым связь между классами одной программы.
  Метод destroyApp () завершает работу приложения. Вызов метода dest-royApp () почти всегда происходит после того, как пользователь решит выйти из программы, воспользовавшись командой Выход из меню приложения. Команда Выход в Java-программах так же может располагаться и на подэкранной клавише, нажав на которую пользователь покидает программу. Работа метода destroyApp () сводится к обнулению всех ссылок в программе и выгрузке мидлета из памяти телефона.
 10.2.1. Структура работы мидлета
  Системные ресурсы телефонов ограничены, поэтому работа в Java- программах строится по принципу поэкранного отображения информации. В один промежуток времени прорисовывается только один экран, за который отвечает класс Display из пакета javax.microedition.lcdui.*. Чтобы произвести смену информации на дисплее, необходимо стереть один экран и нарисовать или отобразить на дисплее другой. Давайте рассмотрим небольшой исходный код примера. В этом простом примере создается простейший класс MyMidlet, отображающий текст на экране и имеющий команду выхода из программы.
 /**
 проект Java Класс MyMidlet */
 // подключаем библиотеки импорта
 
 import javax.microedition.midlet.*; import javax.microedition.lcdui.*;
 // класс MyMidlet
 public class MyMidlet extends MIDlet implements
 CommandListener
 // команда выхода из приложения
 private Command exitCommand;
 // объект d представляет экран телефона
 private Display d;
 // конструктор класса MyMidlet
 public MyMidlet()
 // получаем ссылку на дисплей
 d = Display.getDisplay(this) ;
 // команда выхода
 exitCommand = new Command("Выход", Command.EXIT, 1);
 // старт всей программы public void startAppO
 // создаем текстовый контейнер
  TextBox t = new TextBox("MnnjieT", "Symbian OS ", 256, 0);
 // добавляем команду выхода
 t.addCommand(exitCommand);
 // устанавливаем обработчик событий
 t.setCommandListener(this) ;
 // отражаем текущий дисплей телефона
 d.setCurrent(t) ;
 public void pauseAppO { }
 public void destroyApp(boolean unconditional) { }
 public void commandAction(Command c, Displayable s) {
 if (c == exitCommand) {
 destroyApp(false); notifyDestroyed();
 
  В первых двух строках исходного кода программы Java происходит подключение или импорт двух библиотек Java API в проект. В этих библиотеках содержатся интерфейсы, классы, функции, константы для работы с пользовательским интерфейсом, с командами выхода, перехода в программе и так далее. За библиотеками импорта следует исходный код, объявляющий создание класса MyMidlet, наследуемого от класса MIDlet и задействуется интерфейс CommandListener. import javax.microedition.midlet.*;
  Интерфейс CommandListener нужен для обработки событий, связанных с нажатием клавиш телефона, отвечающих за команды выхода или перехода в программе - это простой обработчик событий, реализованный в исходном коде примера Java с помощью метода commandAction ().
  Создаваемый класс MyMidlet наследует все возможности суперкласса MI Diet из пакета javax.microedition.midlet.*, ему становятся доступными методы startApp (), pauseApp () и destroyApp (), описывая которые вы сможете создать рабочее приложение, private Command exitCommand; private Display d;
  Следующие две строки исходного кода примера Java содержат два глобальных объявления, создающих объект exitCommand класса Command и объект d класса Display. В Java-программировании создание объекта происходит только при выделении ему динамической памяти, то есть при использовании ключевого слова new, а до этого момента объект exitCommand является всего лишь переменной. А вот при создании объекта d класса Display ситуация совсем иная. Давайте перейдем в конструктор класса MyMidlet и познакомимся с этой особенностью подробнее.
 public MyMidlet() {
 d = Display.getDisplay(this) ;
 exitCommand = new Command("Выход", Command.EXIT, 1);
  При создании объекта класса Display использовать оператор new не нужно - в Java 2 ME это делается автоматически. Вы просто создаете объект класса Display, в нашем случае это d, и объект d представляет физический дисплей телефона. При вызове метода getDisplay () происходит получение ссылки на класс Display и ее сохранение в объекте d. Можно сказать, что выделение динамической памяти для объекта класса Display с помощью оператора new заменено конструкцией кода с применением метода getDisplay ().
  Впоследствии в исходном коде для отображения текущего экрана вызывается метод setCurrent (), например: d.setCurrent ();
 В конструкторе класса MyMidlet также создается объект exitCommand, где
 
 используется конструктор класса Command с тремя параметрами. Первый параметр - это текстовая надпись, отображающаяся на экране телефона над подэк-ранной клавишей, при нажатии которой будут происходить предусмотренные для этой клавиши команды действия. Второй параметр конструктора Command как раз и определяет смысл команды назначенной для подэкранной клавиши. В примере Java была использована константа EXIT или выход. И последний параметр в конструкторе Command - это целочисленное значение, определяющее приоритет выполнения данной команды. Поскольку команд в Java-программе может быть много, то необходимо определять приоритет их выполнения. Число меньшее по значению означает высший приоритет для команды.
  За конструктором класса MyMidlet в исходном коде примера Java следует вызов метода startApp (), являющегося входной точкой всего приложения.
 public void startApp() {
 TextBox t = new TextBox("Мидлет", "Symbian OS", 256, 0);
 t.addCommand(exitCommand);
 t.setCommandListener(this);
 d.setCurrent (t);
  В первой строке тела метода startApp () происходит создание объекта t класса TextBox. Класс TextBox - это класс пользовательского интерфейса из состава Java 2ME API (о классах пользовательского интерфейса мы поговорим позже в этой главе). При создании объекта t использовался конструктор класса TextBox с четырьмя параметрами. Первый параметр конструктора класса TextBox - это информационная метка или лейбл, появляющийся в верхней части дисплея телефона и служащий логическим названием для текущего экрана телефона. Второй параметр - это строка текста, доступная для редакции после запуска работы приложения на телефоне. Третий параметр задается целочисленным значением, указывающим на максимальное количество доступных символов для отображения на экране телефона. И последний параметр конструктора класса TextBox устанавливает некоторые специфические ограничения, обычно величина этого параметра задается нулем. Создав объект класса TextBox, вы тем самым создали текстовый контейнер, в котором можно набирать текст с помощью клавиш телефона или редактировать имеющийся. Далее в методе startApp () происходит добавление команды Выход из программы с помощью двух строк кода:
 t.addCommand(exitCommand) ;: t.setCommandListener(this);
  В первой строке происходит присоединение команды Выход к объекту класса t, а во второй строке кода происходит вызов метода setCommandListener () с добавлением обработчика событий к объекту t класса TextBox. И уже в строке программного кода
 
 d.setCurrent (t);
 происходит отображение текущего дисплея телефона. Вызов метода setCurrent () производит прорисовку или обновление текущей информации на дисплее телефона. Системные ресурсы телефонов малы (в основном это относится к частоте работы процессора, нежели к системной памяти телефонов на платформе Symbian OS) и принцип работы Java- приложений сводится к поэкранному виду отображения информации. При каждом изменении состояния дисплея телефона должен следовать вызов метода setCurrent () для обновления содержимого экрана.
 И в конце программного кода из примера Java в строках:
 public void commandAction(Command c, Displayable s) {
 if (c == exitCommand)
 {
 destroyApp(false);
 notifyDestroyed();
 устанавливается обработчик событий для команд программы, с помощью которых пользователь, уже физически выбрав определенную клавишу телефона, может воспользоваться командами приложения. В примере ListinglO_l в методе CommandAction () применяется конструкция операторов if/else для определения событий для команды exitCommand, а это завершение программы и выгрузка мидлета из памяти телефона.
  Таким образом, структура работы мидлета и его жизненный цикл строится в основном классе мидлета, осуществляющем контроль над работой программы.
 10.2.2. Экранная навигация
  Навигация в Java-программах очень важная система и может быть реализована как с помощью классов пользовательского интерфейса содержащихся в пакете javax.microedition.lcdui.*, так и командами, располагающимися над подэкранны-ми клавишами телефона. Обычно на клавиатуре телефонов имеются две клавиши, расположенные непосредственно под дисплеем. Они и служат для обработки команд, находящихся в нижней части экрана телефона над этими клавишами. При создании Java-программы вы можете предусмотреть значительно большее количество команд, и чтобы все эти перечисленные команды были доступны, применяются классы пользовательского интерфейса или подэкранные клавиши. Когда в приложении вы создаете две команды, то при отображении этих команд на дисплее, они размещаются над подэкранными клавишами слева и справа. Если же команд программы больше чем две, то сервис телефона автоматически создает
 
 меню на одной из клавиш телефона, которое становится доступным при нажатии этой клавиши. Создавая меню телефона таким способом, необходимо тщательно продумать модель используемой в приложениях навигации.
  Классы пользовательского интерфейса предоставляют программисту значительно больше возможностей - это и списки, флаги, текстовые поля, кнопки, переключатели и многое другое. Классы пользовательского интерфейса платформы Java 2 ME теоретически разделены на две группы: высокоуровневые и низкоуровневые классы пользовательского интерфейса. Посмотрите на рис. 10.1, где показана иерархия классов пользовательского интерфейса.
 
 Рис. 10.1. Иерархия классов пользовательского интерфейса
  Часть классов, располагающихся в иерархии абстрактного класса Screen, принадлежит к высокоуровневым классам, а часть классов в иерархии Canvas к низкоуровневым.
  Высокоуровневые классы пользовательского интерфейса - это шаблонные классы с набором жестко заданного функционала, необходимого для создания меню, списков, групп выбираемых элементов, флагов переключателей, бегущих строк, кнопок, текстовых полей и много другого. Создавая объекты с применением методов этих классов, вы сможете пользоваться всеми имеющимися возможностями этих классов.
  Низкоуровневые классы пользовательского интерфейса - это классы, дающие возможность программисту работать с графикой и обрабатывать низкоуровневые команды, поступающие с клавиш телефона.
  В своих приложениях вы можете использовать любое количество классов из обоих интерфейсов, комбинируя и компонуя классы в одну программу. На рис. 10.1 изображена иерархия классов для CLDC 1.0/MIDP2.0, на основании этих версий конфигурации и профиля будет происходить построение дальнейшей части главы.
 
 10.3. Высокоуровневый пользовательский интерфейс
  Классы высокоуровневого пользовательского интерфейса из пакета javax.mic-roedition.lcdui.* обладают жестко заданным интерфейсом, и если вы создаете приложения под Symbian OS для серии 60 или UIQ, то нет особой необходимости отслеживать совместимость с разрешением экрана. Классы высокоуровневого интерфейса дают программисту некий шаблонный типаж функциональных возможностей, которые автоматически встраиваются в интерфейс серии 60 и UIQ. Единственное, над чем необходимо осуществлять контроль - это над версией профиля. Для Symbian OS 6.1 доступен только профиль MIDP 1.0 и при создании программ для Symbian OS 6.1 нельзя допускать использование компонентов из MIDP 2.O. Некоторые классы пользовательского интерфейса доступны только в профиле MIDP 2.0, но более того, в некоторых классах для MIDP 1.0 могут содержаться методы, которые работают только с профилем MIDP 2.0! Поэтому будьте внимательны при планировании структурной модели работы приложения. Тем не менее, общая картина с MIDP/CLDC для платформы вполне очевидна: под Symbian OS 6.1 работает связка CLDC 1.0/MIDP 1.0, а для Symbian OS 7.0 и выше связка CLDC 1.0/MIDP 2.O.
 
 10.3.1. Класс TextBox
  Класс TextBox необходим для создания редактируемого текстового контейнера. Создавая объект класса TextBox и присоединяя его к дисплею телефона (то есть, отражая или прорисовывая графический контекст данного класса на экране), вы создаете редактируемую текстовую область для набора букв, цифр и знаков.
  Класс TextBox имеет один конструктор класса с четырьмя параметрами, а так же набор методов для работы с экземплярами класса TextBox. На рис. 10.2 изображен дисплей телефона серии 60 в работе с классом TextBox.
 
 
 РИС. 10.2. Работа
  класса TextBox на телефоне серии 60
 
 10.3.2. Класс List
  Работа с классом List в Java-программах построена на основе выбираемых списков, что собственно и говорит о названии этого класса. Класс List реализует возможности интерфейса Choice при выборе типа создаваемого списка. Можно создавать эксклюзивный, множественный и одиночный тип списка. Класс List содержит два различных по параметрам конструктора служащих для создания объектов этого класса. При создании объектов класса List можно загрузить различные кнопки для списков приложения. На рис. 10.3 представлен класс List в работе на телефоне серии 60.
 
 
 10.3.3. Класс Alert
  С помощью класса Alert в программах создаются различные уведомления информационного характера. Как правило, это небольшое по размеру диалоговое окно (для UIQ) или полностью задействованный экран (для серии 60), но все зависит от конкретной модели телефона.
 Рис. 10.3.
 Работа класса List
 на телефоне серии 60
  Класс Alert может быть использован для предупреждения пользователя о появившейся ошибке или, например, с вопросом о дальнейшей установке программы, то есть класс Alert - это все то, что связано с короткими информационными сообщениями, появляющимися в отдельных и различных по размеру окнах.
  При создании объекта класса Alert можно воспользоваться двумя видами конструкторов: с простым текстовым уведомлением и уведомлением с графическим изображением.
 10.3.4. Класс Form
  Класс Form, пожалуй, самый мощный класс из-за своих специфических свойств. Класс Form - это пустая форма, в которую можно встраивать классы из иерархии суперкласса Item. При создании объекта класса Form и его дальнейшем отображении на дисплее телефона, появится экран с белым фоном, то есть пустая форма. Класс Form имеет два конструктора, и предоставляется большой набор методов для работы с объектами класса Form. А, встраивая подклассы суперкласса Item, уже можно создавать программы с красивым интерактивным интерфейсом. При этом, компонуя программы, можно встраивать любой необходимый набор подклассов Item, отображая их единовременно на одном экране телефона.
  Абстрактный класс Item имеет в своей иерархии восемь подклассов для работы с пользовательским интерфейсом, которые встраиваются в пустую форму (в класс Form). На рис. 10.4 показана иерархия класса Item.
 
 
 
 
 10.3.5. Класс ChoiceGroup
  Класс ChoiceGroup служит для интеграции в форму, группу связанных элементов управления, для последующего выбора необходимых действий. Класс ChoiceGroup работает на основе класса Choice и дает возможность создавать элементы управления типа:
 ? переключатели;
 О флаги;
 ? списки.
  Класс ChoiceGroup имеет два конструктора с двумя и четырьмя параметрами для создания объектов класса. При использовании конструктора с четырьмя параметрами, вы сможете загружать иконки для элементов управления, что сделает программу, безусловно, интересней. Так же класс ChoiceGroup содержит множество методов для работы с элементами управления.
 10.3.6. Класс Stringltem
  Экран телефона должен быть представлен классом Form, куда встраиваются объекты класса Stringltem. С помощью класса Stringltem на экран телефона выводится нередактируемая строка текста.
  С помощью методов и констант класса Stringltem можно оформлять и форматировать текст в виде кнопок или гиперссылок, задавая конкретное место для элементов на экране.
 10.3.7. Класс Text Fie Id
  Применяя класс TextField в своих программах, вы создаете редактируемые текстовые поля с ограничениями. Как правило, класс TextField используется для создания адресных книг или полей для ввода текста или цифр. При создании полей с помощью класса TextField есть возможность строгого определения атрибута этого поля. Например, можно сделать поле для ввода только дробного числа или пароля, адреса электронной почты, номера телефона, текста, Интернет-адреса, а так же комбинаций текста и цифр. Объекты класса TextField интегрируются только в форму созданную на основе класса Form.
 10.3.8. Класс DateField
  Класс DateField используется для работы с датой и временем. Сам класс DateField очень простой, а все его функциональные возможности реализованы программно. Класс DateField интегрируется в форму на основе класса Form.
  Создавая объекты класса DateField можно применять два конструктора класса DateField с двумя и тремя параметрами. При помощи конструктора, состоящего из трех параметров, устанавливается точное время по выбранному часовому поясу.
 
 10.3.9. Класс Spacer
  Дословный перевод названия класса Spacer означает "пространство". Нечто подобное класс Spacer и делает, а именно: организует квадрат или прямоугольник пустого пространства, отодвигая элементы формы на заданные значения. Конструктор класса Spacer, необходимый для создания объектов этого класса, включает в себя два параметра: ширину и высоту создаваемого пространства в пикселях.
 10.3.10. Класс 1т ад el tern
  Для загрузки изображений в программу необходимо воспользоваться классом Image Item. В Java 2 МЕ-программах при работе с изображениями применяется формат PNG (Portable Network Graphics - портативный формат сетевой графики).
  Объекты класса Image Item так же интегрируются в форму, представленную классом Form. Загрузка различных изображений, заставок, фона, фотографий значительно "оживляют" внешний вид приложения.
 10.3.11. Класс Gauge
  Класс Gauge служит для создания измерителей различных процессов на основе интерактивных графических элементов. Обычно класс Gauge применяется при загрузке программ, игр, файлов. В тот момент, когда пользователю необходимо выждать процесс удаления или загрузки появляется измеритель, показывающий графически данный процесс.
  Графически класс Gauge воссоздается на экране телефона как широкая линия, постепенно заполняющаяся определенным цветом по мере прохождения процесса. Но в зависимости от производителей телефонов графический контекст класса Gauge может изменяться по-разному.
 10.3.12. Класс Custom Item
  Класс Си st omit em из иерархии суперкласса Item относительно новый класс и добавлен в профиль MIDP 2.0. На основе класса Customltem программист может встроить в форму нестандартный графический контекст. Это могут быть таблицы построенные, например, по типу Windows программы Excel. Более того, класс Customltem обладает универсальной возможностью работать с событиями, происходящими через нажатия клавиш телефона.
  Платформа Java 2 ME имеет еще огромное количество классов, не входящих в иерархию классов пользовательского интерфейса, но предназначенных именно для упрощения работы по созданию пользовательского интерфейса. Рассмотрим некоторые из них.
 
 10.3.13. Класс Font
  Класс Font из пакета javax.microedition.lcdui.* предлагает программисту набор системных шрифтов для использования в приложениях. Java 2 ME имеет следующие способы отображения шрифтов на экране телефона.
 Размерность шрифта:
 ? большой шрифт;
 ? средний шрифт;
 ? маленький шрифт.
 Стиль шрифта:
 ? жирный шрифт;
 ? курсив;
 ? обычный шрифт;
 ? подчеркнутый шрифт.
 Начертание шрифта:
 ? стандартный шрифт;
 ? пропорциональный шрифт;
 ? шрифт с небольшим интервалом.
  Вполне достойный набор возможностей для отображения шрифта на экране в Java 2 МЕ-программах.
 10.3.14. Класс Ticker
  Не всегда востребованный, но очень интересный класс Ticker создает в приложении бегущую строку по верхней кромке экрана. Бегущая строка появляется на экране справа и двигается налево циклично с одинаковой скоростью.
 10.4. Низкоуровневый пользовательский интерфейс
  В отличие от высокоуровневых классов, низкоуровневые классы пользовательского интерфейса предназначены для работы с графикой и для обработки событий, поступающих с клавиш телефона. Шаблонные классы высокоуровневого интерфейса содержат средства для создания стандартных списков, диалогов, элементов управления и так далее. При работе с этими классами программисту не нужно заботиться о размере, например, диалогового окна или списка, Java 2 ME выполнит эту задачу сама. А вот при работе с низкоуровневыми классами ситуация кардинально меняется и вам придется следить за разрешением дисплея телефона. Каждый производитель телефона придерживается своей конструкции по созданию и разработке внешнего вида и аппаратной части телефона. Но если в отношении клавиш телефона уже имеются сложившиеся стандарты, например, в играх используются клавиши под цифрами 2, 4, 8, 6 и 5 либо джойстик, то с разрешением экрана ситуация противоположная.
 
  Одно из главных человеческих качеств - это восприятие окружающего мира при помощи глаз. Мы можем воспринимать окружающий нас мир таким, какой он есть, то есть объемным (трехмерным) и цветным с огромным, пока не доступным для телефонов и мониторов разрешением "экрана" (если можно так выразиться). И человеку с его способностями хочется такого же большого и качественного экрана в телефоне. Поэтому каждый производитель на свой лад пытается улучшить дисплей телефона, увеличивая разрешение и битность экрана. В связи с этим размеры дисплея изменяются от модели к модели даже одного производителя. При программировании графики средствами Java 2 ME необходимо следить за размерами дисплея телефона. Например, возьмем Sony Ericsson 900 с разрешением 208 х 320 пикселей и Nokia 6600 с разрешением 176 х 208 пикселей -два разных размера экрана и соответственно различные возможности отрисовки графических элементов. Поэтому при программировании графики в Java 2 ME под Symbian OS необходимо очень внимательно планировать работу с низкоуровневыми классами, не забывая так же и об используемых версиях профиля и конфигурации.
 10.4.1. Класс Canvas
  Абстрактный класс Canvas представляет собой обобщенный графический контекст экрана телефона. Для отрисовки графики необходимо создавать свои классы, наследуемые от класса Canvas. В состав этого класса входит большое количество методов для обработки событий, полученных с клавиш телефона. Обработка событий с клавиш телефона происходит на основе "ключевых кодов" или констант, жестко закрепленных за каждой из клавиш. Построение графики происходит при помощи класса Graphics.
 10.4.2. Класс Graphics
  С применением класса Graphics происходит прорисовка или представление на экране телефона графики. Построение графики в Java 2 ME основывается на двухмерной системе координат, изображенной на рис. 9.2 в главе 9.
  В класс Graphics включены разнообразные методы для работы с графикой. Применяя методы этого класса можно рисовать линии, прямоугольники, шрифты, сферы, задавать цвет.
  Класс Graphics может использоваться и в профиле MIDP 1.0, и в профиле MIDP 2.0, но в первой версии MIDP работа с классами Graphics и Canvas несколько отличается от MIDP 2.O. В частности, при создании игр в MIDP 1.0 применяется свой игровой цикл, разбитый на несколько потоков и усложняющий работу с графикой. Посмотрите на исходный код игрового цикла для профиля MIDP 1.0.
 public class DemoGraphics extends Canvas implements Runnable
 {
 public void run()
 
 while (true)
 {
 // обновление графических элементов
 repaint ();
 // задержка цикла на 20 миллисекунд Thread.sleep(20);
 public void paint( Graphics g ) {
  // код, создающий графические элементы } public void keyPressed( int keyCode )
 {
 // обработка событий с клавиш телефона
  В приведенном программном коде игровой цикл разбит на три потока в методах run (), paint () и keyPressed (). Значительно проще реализован тот же самый цикл, но уже для профиля MIDP 2.O. Но, к сожалению, MIDP 2.0 недоступен для Symbian OS 6.1.
 10.4.3. Класс GameCanvas
  Абстрактный класс GameCanvas, как видно из названия, ориентирован на создание мобильных игр. Этот класс доступен только в профиле MIDP 2.O. В иерархии этого класса содержатся еще четыре класса:
 ? Layer,
 ? Layer Manager,
 Li TiledLayer,
 ? Sprite.
  Схема игрового цикла класса GameCanvas значительно усовершенствована и выглядит следующим образом:
 public void run() {
 Graphics g = getGraphics();
 while(true)
 {
 // метод, обрабатывающий нажатия клавиш с телефона
 inputKey();
 // метод, прорисовывающий графику
 GameGraphics();
 
 // копирует графические элементы на экран из внеэкранного буфера flushGraphics();
  Конструкция игрового цикла класса GameCanvas не использует входные системные потоки и содержит один цикл, в теле которого происходит прорисовка графики и обработка событий с клавиш телефона. Применяется также методика двойной буферизации, построенная на работе с внеэкранным буфером, который улучшает качество рисуемой графики.
 10.4.4. Класс Layer
  Класс Layer инкапсулирует основные свойства имеющихся уровней игры. С помощью методов класса Layer происходит прорисовка уровней. Класс Layer имеет два подкласса TiledLayer и LayerManager для работы с уровнями.
 10.4.5. Класс TiledLayer
  Класс TiledLayer необходим для создания фоновых изображений в игре. Можно загружать готовые изображения, а можно использовать работу с ячейками для создания фона игры. Игры, написанные на Java 2 ME, строятся по принципу уровней: на одном уровне находится фоновое изображение, на другом препятствия, артефакты и главный герой, при этом количество уровней не ограничено.
 10.4.6. Класс LayerManager
  А вот класс LayerManager играет роль менеджера уровней, отслеживая имеющиеся уровни в игре и накладывая их один на другой, формируя тем самым полноценную игровую сцену. Несколько методов и конструктор класса LayerManager дают такую возможность.
 10.4.7. Класс Sprite
  Класс Sprite представляет в игре двухмерное изображение (спрайт). Как правило, это активно использующиеся анимированные изображения. В качестве объектов класса Sprite могут быть прорисованы машины, самолеты, бомбы, люди, звери, главные герои, различные бонусы и так далее.
  Работа с классом Sprite основана на использовании анимационной последовательности фреймов для рисования интерактивной графики. Класс Sprite содержит три разных конструктора для создания анимированных и неанимиро-ванных спрайтов. С помощью методов класса Sprite можно производить различные виды трансформации и переопределение опорной позиции спрайта, а также устанавливать столкновение с другими спрайтами или элементами уровней.
 
 10.5. Звуковое сопровождение
  Воспроизведение звуковой дорожки значительно улучшает атмосферу игры, да и представить игру без звука невозможно. В Java-приложениях возможна работа с тональными звуками и воспроизведение звуковых файлов.
  Воспроизведение тональных звуков построено на генерации определенного тона, совпадающего по тональности с музыкальными нотами. Собирая тональные звуки в последовательную цепочку, можно создать незатейливую мелодию, напоминающую звук в играх для консольных приставок Dendy или Sega
  Наиболее интересным вариантом работы со звуком является возможность воспроизведения Java-программами в Symbian OS полноценных звуковых файлов. В таблице 10.1 перечислены все возможные звуковые файлы, поддерживаемые в Java 2 ME и их доступность для каждой платформы.
 Таблица 10.1. Формат поддерживаемых звуковых файлов для Symbian OS
 
 Аудио/Видео формат Symbian OS 7.0 Серия 60 1.2 Серия 60 2.1 UIQMIDP2.0 MIDP1.0 MIDP2.0 Тональные звуки да да да AU audio (*.au) да нет да Wave audio (*.wav) да да да MP3 (*.mp3) да нет нет AMR audio (*.amr) нет да да AMR wideband audio (*.awb) нет да нет Nokia ring tone (*.mg) нет да да MIDI(*.mid) нет да да Polyphonic MIDI (*.mid) нет нет да RAW audio (*.raw) нет да да 3 GPP video (*.3gp) нет да нет NIM video (*.nim) нет нет да MP4 video (*.mp4) нет нет да Real Media video (*.rm) нет нет да Дополнительно телефон Sony Ericsson поддерживает еще форматы RMF (*.rmf). iMelody (*.imy) и MIDI (*mid).
 10.6. Распространение Java 2 ME программ

<< Пред.           стр. 18 (из 32)           След. >>

Список литературы по разделу