Улучшение изображения двойной буферизацией
Эффект мерцания, переливы цвета, затемнение и прочие эффекты, получающиеся заменой отдельных пикселов изображения, удобно создавать с помощью класса 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, приведено много примеров апплетов и приложений с анимацией.