Иллюстрированный самоучитель по Java

Улучшение изображения двойной буферизацией

Эффект мерцания, переливы цвета, затемнение и прочие эффекты, получающиеся заменой отдельных пикселов изображения, удобно создавать с помощью класса Memoryimagesource. Методы newPixeis() этого класса вызывают немедленную перерисовку изображения даже без обращения к методу repaint(), если перед этим выполнен метод setAnimated(true).

Чаще всего применяются два метода:

  • newPixels(int x, int y, int width, int height) – получателю посылается указанный аргументами прямоугольный фрагмент изображения;
  • nevPixels() – получателю посылается все изображение.

В листинге 15.13 показано применение этого способа. Квадрат, выведенный на экран, переливается разными цветами.

Листинг 15.13. Анимация с помощью MemorylmageSource.

import Java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
class InMemory extends Frame{
private int w = 100, h = 100, count;
private int[] pix = new int[w * h];
private Image img;
MemorylmageSource mis;
InMemory(String s){ super(s);
int i = 0;
for(int у = 0; у < h; y++){
int red = 255 * у / (h -1);
for(int x = 0; x < w; x++){
int green = 25$ * x / (w -1);
pix[i++] = (255 << 24}|(red << 16)|(green << 8) | 128;
}
}
mis = new MemorylmageSource(w, h, pix, 0, w);
// Задаем возможность анимации
mis.setAnimated(true);
img = createImage(mis);
setSize(350, 300);
setVisible(true);
}
public void paint(Graphics gr){
gr.drawImage(img, 10, 30, this);
}
public void update(Graphics g) { paint(g); }
public void got){
while (count < 100){
int i = 0;
// Изменяем массив пикселов по некоторому закону
for(int у -0; у < h;,y++)
for (int x. = 0; x < w; x++)
pix[i++J = (255 << 24)|(255 + 8 * count << 16)|
(8*count << 8)| 255 + 8 * count;
// Уведомляем потребителя об изменении
mis.newPixels();
try{
Thread.sleep(100);
}catch(InterruptedException e){}
count++;
}
}
public static void main(String[] args){
InMemory f= new InMemory(" Изображение в памяти");
f.go();
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent ev){
System.exit(0);
}
));
}
}

Вот и все средства для анимации, остальное – умелое их применение. Комбинируя рассмотренные способы, можно добиться удивительных эффектов. В документации SUN J2SDK, в каталогах demo\applets и demo\jfc\Java2D\src, приведено много примеров апплетов и приложений с анимацией.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.