|
|||
|
Примеры программирования на Java
import java.applet.*;
import java.awt.*;
import java.awt.image.*;
import java.util.*;
public class Anim extends Applet implements Runnable {
Image img[],imgSource;
MediaTracker mt;
Color bgColor;
Thread motor;
int numIm,curIm;
int delay;
/*
В методе init происходит первичная инициализация апплета .
Пытаемся считать параметры BGCOLOR, DELAY, IMAGE и FRAMENUM;
если какой-то из параметров не найден, величине присваиваем
значение по умолчанию, правда это не относится к IMAGE ( имя файла
с картинкой ), если нет картинки, то зачем дальше продолжать?
Нужно еще зарезервировать массив, в который будем заносить
созданные изображения
*/
public void init () {
mt = new MediaTracker (this);
String imgNameParam = getParameter("IMAGE");
String delayParam = getParameter("DELAY");
String bgColorParam = getParameter("BGCOLOR");
String imgNumParam = getParameter("FRAMENUM");
if (imgNumParam == null ) {
System.out.println("Can't get FRAMENUM. Use default (10 frames).");
numIm = 10;
} else {
try {
numIm = Integer.parseInt(imgNumParam);
} catch (NumberFormatException e) {
System.out.println("Can't get FRAMENUM. Use default (10 frames).");
numIm = 10;
}
}
if (bgColorParam == null ) {
System.out.println("Can't get BGCOLOR. Use default (white).");
bgColorParam = "255,255,255";
}
StringTokenizer st = new StringTokenizer(bgColorParam,",");
if ( st.countTokens() != 3 ) {
System.out.println("Can't get BGCOLOR. Use default (white).");
bgColor = new Color(255,255,255);
} else {
try {
bgColor = new Color(Integer.parseInt(st.nextToken()),
Integer.parseInt(st.nextToken()),
Integer.parseInt(st.nextToken()));
} catch (NumberFormatException e) {
System.out.println("Can't get BGCOLOR. Use default (white).");
bgColor = new Color(255,255,255);
}
}
if (delayParam == null) {
System.out.println("Can't get DELAY. Use default (100 ms).");
delayParam = "100";
}
try {
delay = Integer.parseInt(delayParam);
} catch (NumberFormatException e) {
System.out.println("Can't get DELAY. Use default (100 ms).");
delayParam = "100";
}
if (imgNameParam == null ) {
System.err.println("Can't get image name. Exit.");
System.exit(1);
}
imgSource = getImage(getDocumentBase(),imgNameParam);
mt.addImage(imgSource,0);
img = new Image[numIm];
curIm=0;
img[curIm]=imgSource;
setBackground(bgColor);
}
/*
Метод paint рисует текущий кадр
*/
public void paint (Graphics g) {
if(img[curIm]!=null)
g.drawImage(img[curIm],0,0,this);
}
public void update (Graphics g) {
paint(g);
}
public void start() {
if (motor == null) {
motor = new Thread (this);
motor.start();
}
}
public void stop () {
if (motor != null)
motor.stop();
}
/*
В методе run создаются все кадры посредством вызова
метода createRotatedImage (Image sourceImage , double alpha),
где sourceImage - исходное изображение, которое потом будет вращаться;
alpha - угол поворота в радианах, изменяется от 0 до 2*PI
Затем приложение входит в беконечный цикл, выводя на экран
последовательно картинки из созданного массива img[] с задержкой
delay (мс).
*/
public void run() {
Runtime r = Runtime.getRuntime();
try {
mt.waitForAll();
} catch (Exception e) {
System.out.println("Interrupted image loading!.");
System.exit(1);
}
double i=0;
for(int j=0;j?numIm;j++) {
i+=2*Math.PI/numIm;
showStatus("Producing the image # "+j);
img[j] = createRotatedImage(imgSource,i);
r.gc();
repaint();
}
showStatus("");
while (true) {
for (curIm=0;curIm?numIm;curIm++) {
repaint();
try {
Thread.sleep(delay);
} catch(Exception e) {};
}
r.gc(); // Поскольку в подобных циклах постоянно накапливается
// мусор (неиспользуемые уже объекты классов),
// то необходимо периодически этот мусор удалять,
// но некоторые реализации виртуальной машины Java забывают
// иногда делать это,
// по этому приходится принудительно заставлять их запустить
// сборщик мусора,
// чтобы избежать переполнения памяти
}
}
/*
createRotatedImage получает исходное изображение и угол поворота,
а возвращает изображение, повернутое на этот угол относительно
оси OY
*/
public Image createRotatedImage(Image img,double a) {
int w = img.getWidth(this);
int h = img.getHeight(this);
int [] pixels = new int[w*h];
int [] pixels2 = new int[w*h];
PixelGrabber pg = new PixelGrabber(img,0,0,w,h,pixels,0,w);
try {
pg.grabPixels();
} catch (InterruptedException e) {
System.err.println("interrupted waiting for pixels!");
System.exit(1);
}
int size=w*h;
int color = bgColor.getRGB();
for(int i=0;i?size;i++)
pixels2[i]=color;
int x;
for (int i=0; i?w; i++) {
x = w/2-(int)Math.round((w/2-i)*Math.cos(a));
if(x?0) x=0;
if(x?=w) x=w-1;
for (int j=0; j?h; j++)
pixels2[j*w+x]=pixels[j*w+i];
}
MemoryImageSource source = new MemoryImageSource(w,h,pixels2,0,w);
Image img2 = createImage(source);
mt.addImage(img2,1);
try {
mt.waitForID(1);
} catch (Exception e) {
System.err.println("Interrapted.");
System.exit(1);
}
return img2;
}
}
Sun Microsystems |
||