Select your language:

Home Главная | Registration Регистрация | Login Вход

Menu Меню сайта
Statistics Статистика

Total online: Онлайн всего: 1
Guests: Гостей: 1
Members: Пользователей: 0
Study entry Форма входа
Логин:
Пароль:
Забыл пароль | Регистрация

Ссылки:

Рис 6.14. Эмулятор телефона, на экране которого представлены разные шрифты

впоследствии будет производиться установка шрифтов для каждого элемента списка. Список элементов представлен объектом mylist и выполнен по типу Exclusive (четыре элемента со своими иконками). В классе List имеется метод setFont () доступный в профиле MIDP 2.0, он и используется в примере.

Создав объект класса List, установим шрифт всем элементам списка:

mylist.setFont(0,fO) mylist.setFont(1,f1) mylist.setFont(2,f2) mylist.setFont(3,f3)

С помощью метода setFont

В конце кода происходит добавление команды выхода и отображение текущего экрана на дисплее телефона. На рис. 6.14 представлена работа программы из листинга 6.13.

К сожалению, ресурсы мобильных телефонов не позволяют воспользоваться обилием шрифтов компьютерной платформы, но и имеющейся базы вполне достаточно для создания разнообразных текстовых элементов. Использование-шрифтов в программах значительно улучшает пользовательский интерфейс и придает приложению более изящный вид. В следующей главе будет рассматриваться программирование графики BJava 2 ME, с помощью классов низкоуровневого интерфейса.

Глава 7. Программирование графики

Высокоуровневые классы, изученные в главе 6, дают возможность создавать пользовательский интерфейс приложения. По сути, эти классы выполнены в виде шаблонов, используя которые вы можете создавать списки, формы, шрифт, группы элементов, бегущие строки. Но использование таких классов-шаблонов несколько упрощает интерфейс программы, лишая возможности использования графики в программах на Java 2 ME. Иногда в приложении необходимо нарисовать таблицу, линию, квадрат, то есть воспользоваться графикой для создания насыщенной и красочной программы. Для э.тих целей в Платформе Java 2 ME существуют так называемые классы низкоуровневого интерфейса - это классы Canvas и GameCanvas (класс GameCanvas будет рассмотрен в следующей главе), а так же класс Graphics, с помощью которого осуществляется непосредственная прорисовка графики на экране телефона. В самом начале этой главы дается характеристика классам Canvas и Graphics, попутно рассматриваются имеющиеся в составе обоих классов методы, после чего мы приступим к практической части и создадим ряд примеров, иллюстрирующих работу обоих классов.

7.1. Класс Canvas

Класс Canvas - это абстрактный класс, поэтому необходимо создавать подклассы для работы с классом Canvas. Абстрактный класс Canvas представляет некий обобщенный графический контекст, что позволяет программе производить прорисовку графики при помощи класса Graphics. Кроме этого, класс Canvas предоставляет возможность в обработке событий полученных с клавиш телефона. Если классы высокоуровневого интерфейса, рассмотренные в главах 5 и б, обрабатывают команды перехода, то с помощью класса Canvas можно получать события с любой нажатой клавиши телефона.

Существует ряд так называемых «ключевыхкодов» в виде заданных констант, с помощью которых можно назначать игровые действия для клавиш телефона. Все ключевые коды соответствуют стандарту ITU-T и заданны в виде следующих констант:

О static int DOWN - движение вниз;

□ static int FIRE - обычно используется в играх и реализует стрельбу из оружия;

□ static int GAME_A - игровая клавиша А; О static int САМЕ_В - игровая клавиша В;

□ static int GAME_C - игровая клавиша С;

□ static' int GAME_D - игровая клавиша D;

□ static int KEY_NUMO - клавиша 0; Q static int KEYNUM1 - клавиша 1; Q static int KEY_NUM2 - клавиша 2; Q static int KEY_NUM3 - клавиша 3; Q static int KEY_NUM4 - клавиша4; Q static int KEY_NUM5 - клавиша 5; Q static int KEYNUM6 - клавиша 6;

□ static int KEY NUM7 - клавиша7:

— 7

Q static int KEY_NUM8 - клавиша 8; ~l static int KEY_NUM9 - клавиша 9; Q static int KEY_POUND — клавиша it; Q static int KEY_STAR - клавиша *; Q static int LEFT — движение влево; Q static int RIGHT — движение вправо; Q static int UP — движение вверх.

Ключевые коды GAME_A, GAME_B, GAME_C, GAME_D и FIRE предназначены специально для игровых действий и обычно задаются клавишам с цифрами соответственно 2,4,8,6 и 5, но зависят от реализации конкретных моделей телефонов.

Большинство методов класса Canvas обеспечивают обработку низкоуровневых событий. Абстрактныйлгетод void paint (Graphics g) является основным методом, с помощью которого происходит прорисовка графики на экране телефона. Класс Graphics определяет, что именно необходимо рисовать на экране телефона. Разберем основную часть методов класса Canvas:

Q int getGameAction (int keyCode) — связывает игровые действия

с заданным ключевым кодом; Q int getKeyCode (int gameAction) —получаетключевой код игровых действий;

□ String getKeyName (int keyCode) - получает ключевой код для клавиши;

Q boolean hasPointerMotionEvents () - проверяет поддержку уст-_ ройством перемещение указателя;

Q protected void keyPressedfint keyCode) — вызывается при нажатии клавиши;

□ protected void keyReleased(int keyCode) — вызывается при отпускании нажатой клавиши;

. Q protected void keyRepeated(int keyCode) - повторное нажатие клавиши;

Q protected abstract void paint (Graphics g) - прорисовка графики на экране телефона;

Q protected void pointerDragged(int x, int у) - определяет перемещение курсора;

7.1.1. Методы класса Canvas

□ protected void pointerPressed(int x, int у) - определяет позицию курсора, при которой должно производится нажатие определенной клавиши;

□ protected void pointerReleased(int х, int у) - определяет позицию курсора в момент отпускания определенной клавиши;

Э void repaint () - повторяет прорисовку;

Э void repaint (int х, int у, int width, int height) -повторяет прорисовку заданной области.

7.2. Класс Graphics

При помощи класса Graphics осуществляется двухмерное представление графики на экране телефона. Класс Graphics существует также в составе Java 2 SE, но в платформе Java 2 ME он сильно урезан, всвязи с ограниченными системными ресурсами телефонов. Поэтому имеется возможность рисовать только линии, прямоугольники, дуги и текст. Для окрашивания этих примитивов предусмотрена работа с цветовой компонентой.

Система координат, используемая для представления графики в Java 2 ME, перевернута по отношению к обычной Декартовой системе координат. Начало системы координат, находится в левой верхней точке экрана телефона. Положительная ость X проходит по верхней кромке экрана слева направо, а положительная ось Y - сверху вниз по левой стороне экрана, как изображено на рис. 7.1.

Такая система координат отнюдь не новшество в программировании двухмер--ной графики. Идентичная модель координат применяется так же в DirectX и OpenGL для представления двухмерных сцен, но уже в компьютерной графике.

0.0

X


>



t


Рис. 7.7. Система координат в Java 2 ME

7.2.1. Методы класса Graphics

Основные методы класса Graphics обеспечивают прорисовку двухмерной графики. Есть еще несколько методов, с помощью которых можно произвести перемещение системы координат и произвести отсечение (chpping). Основные методы класса Graphics:

□ void copyArea(int xsrc, int y_src, int width, int height, int x_dest, int y_dest r int anchor) —копирует прямоугольную область из установленных значений в параметрах (x_src , y_src r width, height), в новую область (x_dest, y_dest);

I

□ void drawArc(int x, int y, int width, int height, int startAngle, int arcAngle) — рисует контур дуги в виде эллипса;

О void drawChar(char character, int x, int y, int anchor) -_ рисует символ;

Q void drawChars (char [] data, int offset, int length, int x, int у, int anchor) - рисует массив символов:

Q void drawlmage (Image img, int x, int yr int anchor) -рисует изображение;

Q void drawLine(int xl, int yl, int x2 , int y2 ) -рисуетлинию из точки xl и yl, до точки х2 и у2;

Q void drawRegion (Image src, int x_src, int y_src, int width, int height, int transform, int xdest, int ydest, int anchor) - копирует изображения в заданную область на экран телефона;

Q void drawRoundRect (int х, int у, int width, int height, int arcWidth, int arcHeight) - рисует контур прямоугольника, используя закругленные углы;

Q void fillArc(int х, int у, int width, int height, int startAngle, int arcAngle) - рисует заполненную цветом дугу;

Q void fillRect(int x, int y, int width, int height) — рисует заполненный цветом прямоугольник;

Q void fillRoundRect.(int x, int y, int width, int height, int arcWidth, int arcHeight) - рисует заполненный прямоугольник, используя закругленные углы;

Q void f illTriangle (int xl, int yl, int x2, int y2, int x3 , int уЗ) - рисует заполненный цветом треугольник;

Q int getBlueComponent () — получает синий компонент цвета;

Q int getClipHeight О - получаетвысотудля текущей области отсечения;

Q int getClipWidth () - получает ширину для текущей области отсечения;

Q int getColor() - получает текущий цвет;

□ Font get Font () - получает текущий шрифт;

Q int getGreenComponent (> - получает зелениый компонент цвета; Q int" getRedComponent () - получает красный компонент цвета; Q void setClipfint х, int у, int width, int height)-устанавливает отсечение заданной области экрана;

□ 'void setColor(int RGB) - устанавливает цвет при помощи значения

RGB;

Q void setColor(int red, int green, int blue) - назначает цвет

при помощи трех цветовых компонентов re d, g re e n и blue; Q void setFont (Font font) - устанавливает заданный шрифт;

□ void setStrokeStyle (int style) — задает штриховой стиль рисуемому контексту, используя константы SOLID и DOTTED;

□ void translate (int x, int у) — переметает систему координат в точку х и у.

При использовании некоторых методов, очень часто используется параметр int anchor. С помощью этого параметра задаются различные значения для выбора позиции. Посмотрите на рис. 7.2, где изображен механизм прорисовки текста с выбором определенной позиции.

 

BASELINE

BOTTOM

HCENTER

Рис. 7.2.Техникапрорисовкитекста

Для этих целей в классе Graphics имеются константы, с помощью которых происходит выбор позиции:

О static int BASELINE - задает базовую линию;

□ static int BOTTOM - сдвигает вниз; О static int HCENTER - центрирует;

□ static int LEFT - сдвигает влево;

□ static int RIGHT - сдвигает вправо;

□ static int TOP — сдвигает вверх;

□ static int VCENTER - используется только при прорисовке изображений, производит вертикальную центровку всего изображения.

Можно использовать две константы для выбора позиции. Например, для того чтобы сдвинуть текст влево и вверх, используется комбинация Graphics . LEFT I Graphics.TOP.

Далее мы перейдем к практике и изучим модель программирования графики в приложении на Java 2 ME, рассмотрим создание и отрйсовку линий, прямоугольников, дуг и текста. Главное о чем надо помнить при использовании графических элементов - это о размере экрана телефона. Разные модели телефонов имеют свои размеры дисплея; и если вы будете использовать большой по площади экран, например 128x128 пикселей, то на экране с разрешением 101x80, некоторые части графических элементов будут срезаны. Чтобы этого избежать, надо использовать методы класса Canvas; getwidth () и getHeight (), которые

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

int w = getwidth () drawLine(20, 20, w-20, w-20);

В своих примерах к этой главе я специально не использую оптимизации графики, для того чтобы исходный код был более понятен. Поэтому после компиляции всех примеров обязательно запустите получившиеся программы на максимальном количестве имеющихся эмуляторов. Особенно попробуйте работу этих программ на эмуляторе DefaultColorPhone из состава среды программирования J2ME Wireless Toolkit 2.1, меня лично очень сильно позабавил результат работы этого эмулятора, а вам, я думаю, предоставит некоторую пищу для размышлений.

7.3. Рисование линий

Для того чтобы нарисовать линию нужно воспользоваться методом draw-Line () класса .Graphics. Рассмотрим прототип этого метода:

public void drawLine(int xl,

int yl, int x2,

int y2)

' - i

Параметры метода drawLine ():

□ xl - координата начальной точки отрезка по оси X;

□ yl -.координата начальной точки отрезка по оси Y;

□ х2 - координата конечной точки отрезка по оси X; О у2 - координата конечной точки отрезка по оси Y. .

Задавая целочисленные координаты точек в методе drawLine , можно нарисовать любую линию заданного размера. Также можно воспользоваться методом setColor () для закрашивания линий цветом пметодом setStroke Style () -для рисования линии в виде пунктира.

Рассмотрим пример кода находящийся в листинге 7.1, где с помощью линий рисуется система координат используемая в Java 2 ME. Исходный код листинга 7 Л также находится на компакт-диске в папке \Code\Listing7_l\src.

I** . •

Листинг 7.1

Класс Main и класс Line */

import javax.microedition.lcdui.*; import javax.microedition.midlet.*;

public class Main extends MIDlet implements CommandListener

{

// команда выхода из программы

private Command exitMidlet = new Command ( "Выход" , Command. EXIT, Ob-public void startAppO {

// создаем объект класса Line Line myline = new Line ( ) ;

// добавляем команду выхода myline.addCommand(exitMidlet); myline.setCommandListener(this); Display.getDisplay(this),setCurrent(myline);

public void pauseApp ( ) {}

public void destroy App( boolean unconditional) {}

public void commandAct ion (Command С , Displayable d) {

if (c == exitMidlet) {

destroyApp (false); notifyDestroyed () ; 

>

} }

класс Line определен в файле Line.Java */

import javax.microedition. lcdul. *;

public class Line extends Canvas {

// конструктор public Line(){ super () ; }

public void paint (Graphics g)

Рисование линий

(

// устанавливается синий цвет для линий g.setColor(OxOOOOff) ; // рисуется система координат д.drawLine(20, 20, 90, 20) g.drawLine(20, 20, 20, 90) g.drawLine(90, 20, 80, 10) g.drawLine(50, 20, 80, 30) g.drawLine(20, 90, 10, 80) g.drawLine(20, 90, 30, 80)

/ / устанавливается красный цвет для трех линий g.setColor(Oxffff0000); / / рисуем толстую линию в три пикселя g.drawLine(30, 30, 70, 30) д.drawLine(30, 31, 70, 31) д.drawLine(30, 32, 70, 32) // устанавливаем пунктир д. setStrokeStyle(Graphica DOTTED) ,-/ / рисуем линию в два пикселя пунктиром g.drawLine(30, 50, 70, 50); д.drawLine(30, 51, 70, 51);

>

}

В листинге 7.1 используются два класса: Main, являющийся основным классом мидлета приложения, и класс Line, в котором происходит работа с графикой. Подразумевается, что оба класса находятся в файлах Main.java и Line.java, это характерно для объектно-ориентированного программирования и в дальнейшем мы будем придерживаться именно такой модели построения изучаемых примеров. Основной класс мидлета Main очень прост. В этом классе создается объект класса Line, добавляется команда выхода из приложения и отражается текущий экран. Класс Line, находящийся в файле Line.java листинга 7.1, рисует набор различных линий. Сам класс Line наследуется от абстрактного класса Canvas. В более сложных программах может использоваться интерфейс Run-nable и метод run (). Такая техника программирования обычно используется при создании игр, и будет обсуждаться в конце этой главы.

Конструктор класса Line использует метод super () позволяющий обратиться к конструктору своего суперкласса Canvas. Основные же события происходят в методе paint () класса Canvas.

В строке кода:

g.setColor(0x0000ff)

происходит назначение цвета для любого последующего отрисованного примитива. То есть вызов метода setColor () с заданным цветом действителен до момента последующего вызова метода setColor ( ) , устанавливающего другой

цвет. В этом примере используется метод setColor (RGB), поэтому значение цвета задается восьмеричным значением с помощью нулей и букв. В следующем примере из раздела 7.4 при рисовании прямоугольников будет показана работа метода setColor () с тремя целочисленными параметрами, задающими значение цвета.

В строках кода

g.drawLine(20, 20, 90, 20); д.drawLine(20, 20, 20, 90); g.drawLine,(90, 20, 80, 10); д.drawLine(90, 20, 80, 30); . д.drawLine(20, 90, 10, 80); д.drawLine(20, 90, 30, 80);

рисуется шесть синих линий, образующих систему координат. Толщина всех линий равна одному пикселю - это значение по умолчанию и изменить его нельзя. Для того чтобы нарисовать широкую линию, придется рисовать несколько соприкасающихся одинаковых по размеру линий.

g.drawLine(30, 30, 70, 30); g.drawLine(30, 31, 70, 31); д.drawLine(30, 32, 70, 32);

Этими строками кода рисуется одна толстая линия шириной в три пикселя.

В конце в методе paint С ' рисуется линия толщиной в два пикселя в виде пунктирной линии. Для этого используется метод setStrokeStyleС) и константа DOTTER. На рис. 7.3 изображен эмулятор телефона с результатом работы программы из листинга 7.1.

7.4. Рисование прямоугольников

При создании прямоугольников можно использовать два метода класса Graphics — это drawRect () и f illRe ct () - При помощи метода draw Re ct () рисуется только контур прямоугольника, аметод fi 1 IRect () позволяет нарисовать прямоугольник уже закрашенным каким-либо

цветом, (изначально по умолчанию цвет чер-та>ш). Оба метода абсолютно идентичны по количеству и назначению параметров, поэтому

рассмотрим прототип одного из них, а именно метода drawRect

public void drawRect (int x,

int y, int width, int he ight)

Рис. 7.3. Рисование разноцветных линий

Для перехода к следующей странице статьи перейдите по вы подающему меню

Basket Корзина
Your basket is empty Ваша корзина пуста
'); $(el).append(g); $(g).show(); } _uPostForm('',{type:'POST',url:'/shop/basket',data:{'mode':'clear'}}); return false; } function removeBasket(id){ if(lock_buttons) return false; else lock_buttons = 1; $('#basket-item-'+id+' .sb-func').removeClass('remove').addClass('myWinLoadS').attr('title',''); _uPostForm('',{type:'POST',url:'/shop/basket',data:{'mode':'del', 'id':id}}); return false; } function add2Basket(id,pref){ if(lock_buttons) return false; else lock_buttons = 1; var opt = new Array(); $('#b'+pref+'-'+id+'-basket').attr('disabled','disabled'); $('#'+pref+'-'+id+'-basket').removeClass('done').removeClass('err').removeClass('add').addClass('wait').attr('title',''); $('#'+pref+'-'+id+'-options').find('input:checked, select').each(function(){ opt.push(this.id.split('-')[3]+'-'+this.value);}); _uPostForm('',{type:'POST',url:'/shop/basket',data:{'mode':'add', 'id':id, 'pref':pref, 'opt':opt.join(':'), 'cnt':$('#q'+pref+'-'+id+'-basket').attr('value')}}); return false; } function buyNow(id,pref){ if(lock_buttons) return false; else lock_buttons = 1; var opt = new Array(); $('#b'+pref+'-'+id+'-buynow').attr('disabled','disabled'); $('#'+pref+'-'+id+'-buynow').removeClass('done').removeClass('err').removeClass('now').addClass('wait').attr('title',''); $('#'+pref+'-'+id+'-options').find('input:checked, select').each(function(){ opt.push(this.id.split('-')[3]+'-'+this.value);}); _uPostForm('',{type:'POST',url:'/shop/basket',data:{'mode':'add', 'id':id, 'pref':pref, 'opt':opt.join(':'), 'cnt':$('#q'+pref+'-'+id+'-basket').attr('value'), 'now':1}}); return false; } //-->
Search Поиск
Calendar Календарь
«  March Март 2011  »
Mon Пн Tues Вт Wed Ср Thurs Чт Fri Пт Sat Сб Sun Вс
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Archive records Архив записей

Ссылки:

Rambler's Top100 Все для дома - Бытовая техника, опубликовать информацию о фирме
QLE 88x31

раскрутка сайта в интернете Рейтинг сайтов Товары / Услуги

Copyright MyCorp © 2011 Создать сайт бесплатно

Copyright MyCorp © 2011