Чтение онлайн

на главную

Жанры

Шрифт:

Демонстрирует преобразование контекста Graphics в Canvas.

@смотри javax.microedition.lcdui. Graphics

*/ public class TranslationDemo extends Canvas

implements CommandListener

{

private final int WHITE = OxFF «16 I OxFF «8 | OxFF;

private GraphicsDemo gDemo = GraphicsDemo.getlnstance ;

private Display display = Display.getDisplay(gDemo);

private static Command back = new Command("Back", Command.BACK, 1);

private static Command go = new Command("Go", Command.SCREEN, 1);

private static final int ORIGINAL_STATE = 1;

private static final int TRANSLATED_STATE = -1;

// Координата х начального рисунка, private int x = 20;

// Координата у начального рисунка, private int у = 20;

// Величина переноса в направлении х. private int deltaX = 30;

// Величина переноса в направлении у. private int deltaY = 30;

// Задает переменную, которая сообщает программе, рисовать ли на экране

// в первоначальной позиции или в преобразованной позиции,

private int state = ORIGINAL_STATE;

/**

Конструктор.

*/

public TranslationDemo

{

super ;

addCommand(back);

addCommand(go);

setCommandListener (this);

display.setCurrent(this);

}

protected void paintClipRect(Graphics g)

{

int clipX = g.getClipX;

int clipY = g.getClipY;

int clipH = g.getClipHeight; int clipW = g.getClipWidth;

int color = g. getColor;

g. setColor(WHITE);

g. fillRect(clipX, clipY, clipW, clipH);

g. setColor (color);

}

public void paint(Graphics g)

{

int w = 50;

int h = 50;

paintClipRect(g); g.fillRect(x, y, w, h);

}

// Переключает режим рисования. Этот метод вызывается во время

// обработки команды «Go», которая переключает перемещение.

private void toggleState

{

state = — state;

}

// Переключает преобразование. Перерисовывает заново Canvas.

private void toggleTranslation

}

if (state == ORIGINAL_STATE)

x = x + deltaX; у = у т deltaY;

}

else

{

x = x — deltaX;

у = у — deltaY; 1 toggleState;

// Запрашивает у реализации вызов метода paint для восстановления

// Canvas. Это выражается в генерировании внутреннего события

// рисования, которое обрабатывается реализацией, repaint ;

*/

public void commandAction(Command c, Displayable d)

{

if (с == back)

GraphicsDemo.getInstanced.display!);

}

else if (c == go)

{

toggleTranslation;

}

}

}

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

Kaк рисуются компоненты

Вы, возможно, заметили, что метод toggleTranslation в листинге 6.8 вызывает Canvas.repaint . Этот вызов требует, чтобы реализация перерисовывала дисплей.

Вызов Canvas.repaint выражается в событии внутренней реализации, представляя запрос обновления. Реализация обрабатывает событие внутренне. Она назначает вызов метода paint Canvas, который выполняется реализацией, а не вашей программой.

Canvas должен быть закрашен для визуализации всех элементов, изображенных в его контексте, или для перерисовки поврежденных пикселей. Однако вы никогда не должны вызывать paint прямо. Если вы желаете перерисовать ваш Canvas, вы должны создать вызов repaint . Или вы можете вызвать следующую версию перегрузки, которая также определяется в классе Canvas:

void repaint(int x, int у, int width, int height)

Эта версия требует перерисовки прямоугольной области, определяемой параметрами, указанными в вызове.

Обратите внимание, что вы все равно должны перерисовать поврежденные пиксели, прежде чем создавать- вызов на перерисовку Canvas. Это требование отличается от требований приложений, написанных в AWT или Swing. В AWT и Swing вызов repaint выполняет две операции: он сначала вызывает update, а затем — paint (Graphics g). Вызов update приводит к тому, что реализация стирает Panel, Canvas или JComponent. Такого вызова в МГОР нет, так что вы должны перерисовать поврежденные пиксели сами. Обратите внимание, что в листинге 6.6 метод paint (Graphics g) все равно вызывает метод paintClipRect(Graphics g).

Двойная буферизация

Термин двойная буферизация относится к технике буферизации графического контекста перед его отображением. Эта идиома требует, чтобы вы использовали два графических контекста — или буфера — отсюда ее название.

Вы сначала рисуете графические данные во вторичном графическом контексте, а затем копируете его содержимое в графический контекст, представленный дисплеем устройства. Этот вторичный графический контекст называется внеэкранным буфером. Внеэкранный буфер не отображает на дисплее.

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

В листинге 6.9 демонстрируется использование двойной буферизации. Код выполняет несколько простых функций рисования во внеэкранном буфере, затем копирует содержимое этого буфера в саму графическую среду, которая представляет дисплей устройства. Хотя процедуры рисования в этом примере относительно просты, реальное приложение может выполнять намного более сложное рисование, действительно подтверждая необходимость двойной буферизации.

Листинг 6.9. Двойная буферизация использует два графических контекста. Единственный способ получить второй графический контекст в МЮР — через класс Image

import javax.microedition.lcdui.Canvas;

import javax.microedition.lcdui.Command;

import javax.microedition.lcdui.CommandListener;

import javax.microedition.lcdui.Display;

import javax.microedition.lcdui.Displayable;

import javax.microedition.lcdui.Graphics;

import javax.microedition.lcdui.Image;

import Java.io.lOException;

Демонстрирует двойную буферизацию графического контекста для отображения в Canvas.

public class DoubleBufferDerao extends Canvas

implements CommandListener

{

// Константа, которая представляет белый цвет.

private static final int WHITE = OxFF «16 I OxFF «8 | OxFF;

private static Command back = new Command("Back", Command.BACK, 1);

GraphicsDemo gDemo = GraphicsDemo.getlnstance;

private Display display = Display.getDisplay(gDemo);

// Объект изображения, используемый для получения

// внеэкранного объекта Graphics, private Iraage offscreen;

// Переменная, используемая для определения того, осуществляет

// ли реализация автоматическую двойную буферизацию.

// Сохраняет значение true, если реализация автоматически

// осуществляет двойную буферизацию, иначе становится

false. private boolean autoDoubleBuffered = true;

/**

Популярные книги

Огни Эйнара. Долгожданная

Макушева Магда
1. Эйнар
Любовные романы:
любовно-фантастические романы
эро литература
5.00
рейтинг книги
Огни Эйнара. Долгожданная

Вернуть невесту. Ловушка для попаданки

Ардова Алиса
1. Вернуть невесту
Любовные романы:
любовно-фантастические романы
8.49
рейтинг книги
Вернуть невесту. Ловушка для попаданки

Смертник из рода Валевских. Книга 1

Маханенко Василий Михайлович
1. Смертник из рода Валевских
Фантастика:
фэнтези
рпг
аниме
5.40
рейтинг книги
Смертник из рода Валевских. Книга 1

Быть сильнее

Семенов Павел
3. Пробуждение Системы
Фантастика:
боевая фантастика
рпг
6.17
рейтинг книги
Быть сильнее

Измена. Жизнь заново

Верди Алиса
1. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Жизнь заново

Отмороженный

Гарцевич Евгений Александрович
1. Отмороженный
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Отмороженный

Муж на сдачу

Зика Натаэль
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Муж на сдачу

Фиктивная жена

Шагаева Наталья
1. Братья Вертинские
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Фиктивная жена

Жандарм

Семин Никита
1. Жандарм
Фантастика:
попаданцы
альтернативная история
аниме
4.11
рейтинг книги
Жандарм

Совок 4

Агарев Вадим
4. Совок
Фантастика:
попаданцы
альтернативная история
6.29
рейтинг книги
Совок 4

Идеальный мир для Лекаря 20

Сапфир Олег
20. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 20

Дракон - не подарок

Суббота Светлана
2. Королевская академия Драко
Фантастика:
фэнтези
6.74
рейтинг книги
Дракон - не подарок

Воин

Бубела Олег Николаевич
2. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.25
рейтинг книги
Воин

Сильнейший ученик. Том 3

Ткачев Андрей Юрьевич
3. Пробуждение крови
Фантастика:
фэнтези
боевая фантастика
аниме
5.00
рейтинг книги
Сильнейший ученик. Том 3