Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java ME (J2ME) > Сохранение результата рисования


Автор: newinfo2008 24.4.2008, 15:15
Привет всем.
Я лазил по форуму, н омногое не понял как это сделать.
Есть канва, на ней пользователь рисует, но например когда хочется переключить инструмент, то надо открывать новое окно, чтобы выбрать инструмент рисования, а когда возвращается пользователь на экран с канвой, то результаты прошлого его рисования затираются.
Вопрос, что можно сделать, чтобы результаты сохранились и отобразились на экране как они были до переключения окна?
Разъясните пожалуйста кодом подробным кто как делает.
Буду очень благодарен.

Автор: eugine_s 24.4.2008, 15:48
Обычно, то что ты просишь, не нужно... так как канвас почти всегда нужно перерисовать заново.

Я обычно перед перерисовкой полностью очищаю экран (Graphics.fillRect(0,0, screenWidth, screenHeight);) и после этого вывожу заново все что должно быть на экране.

Но если ты все же хочешь знать, как сделать чтобы изображение экрана сохранялось, то вот так:

Код


Image buffer;
Graphics bufferGr;

//инициализация 
public void init() 
{
buffer = Image.createImage(screenWidth, screenHeight);
bufferGr = buffer.getGraphics();
}

public void draw() 
{
//тут будем рисовать на bufferGr; 
// в данном случае очищаем экран черным цветом и рисуем линию 
bufferGr.setColor(0x000000);
bufferGr.fillRect(0,0,screenWidht, screenHeight);
bufferGr.setColor(0x00FF00);
bufferGr.drawLine(0,0, screenWidth, screenHeight);
}

public void paint(Graphics g) 
{
//если нужно обновить изображение в буффере вызываем метод draw();

//тут отрисовываем наш буффер. собственно, то что ты хотел узнать.
g.drawImage(buffer, 0, 0, 0);
}



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

Кстати, к чему это я про двойную буферизацию:

Ответ на вопрос:
Цитата(newinfo2008 @  24.4.2008,  15:15 Найти цитируемый пост)
Вопрос, что можно сделать, чтобы результаты сохранились и отобразились на экране как они были до переключения окна?


Использовать двойную буферизацию (ну или какой-то буфер для рисования в него).

Автор: newinfo2008 24.4.2008, 16:00
eugine_s
Спасибо, я все-таки ещё покапался в инете и нашел про двойную буфферизацию smile
Код, который ты привел, у меня примерно такой же получился. у меня все в пейнте это запихано просто напросто, вроде работает smile
Спасибо, за мгновенную помощь smile

Автор: Majesty 7.5.2008, 10:24
eugine_s, а нельзя просто завести экземпляр Graphics и скидывать в него по мере рисования текущее состояние из paint'а? Не очень разбираюсь в этой кухне, потому и спрашиваю smile 

Автор: eugine_s 7.5.2008, 12:04
Цитата(Majesty @  7.5.2008,  10:24 Найти цитируемый пост)
а нельзя просто завести экземпляр Graphics


У Graphics есть конструктор?

Автор: Dummy 7.5.2008, 15:15
Цитата

У Graphics есть конструктор? 


Ну, вообще, где-то в недрах JVM он обычно бывает, конечно, но разработчику мидлета недоступен  smile   А как вариант для того, что спросил Majesty, можно использовать GameCanvas. У каждого из таких канвасов есть собственный доступный разработчику off-screen буфер. Использовать его можно примерно так:

Код


GameCanvas canvas = new GameCanvas(false);
Graphics offscreenGraphics = canvas.getGraphics();

// this - это ссылка на наш мидлет
Display.getDisplay(this).setCurrent(canvas);

// рисуем все, что хотим, в offscreenGraphics

// делаем что-то еще, не связанное с рисованием

// момент истины - выбрасываем все, что нарисовали, на экран
canvas.flushGraphics();




Конечно, этим методом следует пользоваться аккуратно и использовать либо в внутри [Game]Canvas.paint(), либо хотя бы использовать Display.callSerially(), дабы синхронизировать эту отрисовку с другими операциями графической системы.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)