Java -практика использования

         

Анимация рисованием



Листинг 15.12. Анимация рисованием

import Java.awt.*;

import j ava.awt.event.*;

import Java.awt.geom.*;

import java.awt.image.*;

class DrawAniml extends Frame{

private Image img; 

private int count;

DrawAniml(String s) { 

super(s);

MediaTracker tr = new MediaTracker(this);
 

img = getToolkit().getlmage("back2.jpg");
 

tr.addlmage(img, 0);
 

try{

tr.waitForlD(0) ; 

}catch(InterruptedException e) {}

SetSize(400, 400);
 

setvisible(true);

}

public void update(Graphics g){ 

Graphics2D g2 = (Graphics2D)g; 

int w = getSizeO.width, h = getSize().height; 

Bufferedlmage bi = (Bufferedlmage)createlmage(w, h) ; 

Graphics2D big = bi.createGraphics();

// Заполняем фон изображением img 

big.drawlmage(img, 0, 0, this);

// Устанавливаем цвет рисования 

big.setColor(Color.red);

// Рисуем в графическом контексте буфера круг, 

// перемещающийся по синусоиде 

big.fill(new Arc2D.Double(4*count, 50+30*Math.sin(count),

50, 50, 0, 360, Arc2D.OPEN));
 

// Меняем цвет рисования 

big.setColor(getForeground());

// Рисуем горизонтальную прямую 

big.draw(new Line2D.Double(0, 125, w, 125));

// Выводим изображение-буфер на экран 

g2.drawlmage(bi, 0, 0, this);
}

public void go(){ 

while(count < 100){ 

repaint();
 

try{

Thread.sleep(10);
 

}catch(InterruptedException e){} 

count++; 

public static void main(String[] args){

DrawAniml f = new DrawAniml(" Анимация");

f.go();

f.addWindowListener(new WindowAdapter(){

public void windowClosing(WindowEvent ev){

System.exit(0);
 

}

});
 

}

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

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

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



Содержание раздела