Модераторы: javastic, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сохранение результата рисования, Проблемы с сохранением 
V
    Опции темы
newinfo2008
Дата 24.4.2008, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 4.1.2008
Где: Саратовская облас ть, г. Ершов

Репутация: нет
Всего: нет



Привет всем.
Я лазил по форуму, н омногое не понял как это сделать.
Есть канва, на ней пользователь рисует, но например когда хочется переключить инструмент, то надо открывать новое окно, чтобы выбрать инструмент рисования, а когда возвращается пользователь на экран с канвой, то результаты прошлого его рисования затираются.
Вопрос, что можно сделать, чтобы результаты сохранились и отобразились на экране как они были до переключения окна?
Разъясните пожалуйста кодом подробным кто как делает.
Буду очень благодарен.
PM MAIL ICQ   Вверх
eugine_s
Дата 24.4.2008, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 14.11.2007
Где: Киев

Репутация: 17
Всего: 17



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

Я обычно перед перерисовкой полностью очищаю экран (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 Найти цитируемый пост)
Вопрос, что можно сделать, чтобы результаты сохранились и отобразились на экране как они были до переключения окна?


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

PM MAIL   Вверх
newinfo2008
  Дата 24.4.2008, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 4.1.2008
Где: Саратовская облас ть, г. Ершов

Репутация: нет
Всего: нет



eugine_s
Спасибо, я все-таки ещё покапался в инете и нашел про двойную буфферизацию smile
Код, который ты привел, у меня примерно такой же получился. у меня все в пейнте это запихано просто напросто, вроде работает smile
Спасибо, за мгновенную помощь smile
PM MAIL ICQ   Вверх
Majesty
Дата 7.5.2008, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 20.3.2005
Где: Almaty, Kazakhsta n

Репутация: нет
Всего: нет



eugine_s, а нельзя просто завести экземпляр Graphics и скидывать в него по мере рисования текущее состояние из paint'а? Не очень разбираюсь в этой кухне, потому и спрашиваю smile 
PM MAIL WWW   Вверх
eugine_s
Дата 7.5.2008, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 14.11.2007
Где: Киев

Репутация: 17
Всего: 17



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


У Graphics есть конструктор?
PM MAIL   Вверх
Dummy
Дата 7.5.2008, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 21.5.2007

Репутация: 7
Всего: 19



Цитата

У 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(), дабы синхронизировать эту отрисовку с другими операциями графической системы.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса

  • Прежде чем задать вопрос прочтите это!
  • Литература по Java находится здесь.
  • Литературу по Java обсуждаем здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда

  • FAQ раздела лежит здесь!
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java ME (J2ME) | Следующая тема »


 




[ Время генерации скрипта: 0.0684 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.