?? ripple.java
字號:
import java.applet.Applet;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.MediaTracker;
public class Ripple extends Applet implements Runnable {
Thread thread = null;
private Graphics g, refraction;
private Image image, refimage;
private int currentImg;
private int imageW = 0, imageH = 0;
private int ovalW = 0, ovalH = 0;
private boolean finishLoad = false;
private final int frames = 12;
private String name = "";
public void init() {
//初始化applet
String param;
//從html文件中獲取圖片文件名
param = getParameter("image");
if (param != null)
name = param;
}
public void paint(Graphics g) {
//如果已經載入圖片,則返回
if (!finishLoad)
return;
//輸出倒影圖片
if (refimage != null) {
g.drawImage(refimage, (-currentImg * imageW), imageH, this);
g.drawImage(refimage, ((frames - currentImg) * imageW), imageH,
this);
}
//輸出正向圖片
g.drawImage(image, 0, -1, this);
}
public void start() {
//啟動applet,創建并啟動線程
if (thread == null) {
thread = new Thread(this);
thread.start();
}
}
public void run() {
//啟動線程
//加載圖片
currentImg = 0;
g = getGraphics();
MediaTracker imageTracker = new MediaTracker(this);
String strImage;
image = getImage(getDocumentBase(), name);
imageTracker.addImage(image, 0);
try {
imageTracker.waitForAll();
finishLoad = !imageTracker.isErrorAny();
} catch (InterruptedException e) {
}
//圖片寬度、圖片高度
imageW = image.getWidth(this);
imageH = image.getHeight(this);
//生成倒影
createRipple();
//重新輸出applet
repaint();
while (true) {
try {
if (!finishLoad)
return;
if (refimage != null) {
g.drawImage(refimage, (-currentImg * imageW), imageH, this);
g.drawImage(refimage, ((frames - currentImg) * imageW),
imageH, this);
}
g.drawImage(image, 0, -1, this);
if (++currentImg == frames)
currentImg = 0;
Thread.sleep(50);
} catch (InterruptedException e) {
stop();
}
}
}
public void createRipple() {
//產生水波特效
Image back = createImage(imageW, imageH + 1);
Graphics offg = back.getGraphics();
int phase = 0;
int x, y;
double p1;
offg.drawImage(image, 0, 1, this);
for (int i = 0; i < (imageH >> 1); i++) {
offg.copyArea(0, i, imageW, 1, 0, imageH - i);
offg.copyArea(0, imageH - 1 - i, imageW, 1, 0, -imageH + 1
+ (i << 1));
offg.copyArea(0, imageH, imageW, 1, 0, -1 - i);
}
refimage = createImage((frames + 1) * imageW, imageH);
refraction = refimage.getGraphics();
refraction.drawImage(back, frames * imageW, 0, this);
for (phase = 0; phase < frames; phase++) {
p1 = 2 * Math.PI * (double) phase / (double) frames;
x = (frames - phase) * imageW;
for (int i = 0; i < imageH; i++) {
y = (int) ((imageH / 14)
* ((double) i + 28.0)
* Math.sin((double) ((imageH / 14) * (imageH - i))
/ (double) (i + 1) + p1) / (double) imageH);
if (i < -y)
refraction.copyArea(frames * imageW, i, imageW, 1, -x, 0);
else
refraction.copyArea(frames * imageW, i + y, imageW, 1, -x,
-y);
}
}
offg.drawImage(image, 0, 1, this);
image = back;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -