资料来源:https://www.bilibili.com/video/BV1Aq4y1W79E?p=5&spm_id_from=pageDriver
package cn.tx.snow;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.Objects;
public class MyImage extends JPanel{
// 定义成员图片对象。当前窗口显示的图片
BufferedImage bgImage;
public static void main(String[] args) throws IOException {
// 创建窗口
JFrame frame = new JFrame();
// 设置窗体大小
frame.setSize(800,1800);
// 设置标题
frame.setTitle("Java版电子相册");
// 设置窗体居中显示
frame.setLocationRelativeTo(null);
// 关闭窗口,把JVM停止
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 创建面板对象
// JPanel jPanel = new JPanel();
MyImage myImage = new MyImage();
// 把面板对象存放到窗口上
frame.add(myImage);
// 调用初始化图片的方法
myImage.initImgs();
// 把图片画到窗口上去,调用绘图的方法
// 重绘,底层调用的是paint方法
// myImage.repaint();
// 写方法。让ff一直变化,开启新的线程
myImage.begin();
// 显示出窗口
frame.setVisible(true);
}
// 设置图片显示比例值
float ff = 20f;
// 声明数组的下标
int num = 0;
// 让ff的值一直变化,方法执行结束,整个线程就执行结束
public void begin(){
new Thread(new Runnable() {
// 启动线程
@Override
public void run() {
// 一直去改变ff的值,使图片越来越清晰
while (true){
// 从数组中获取图片
bgImage = images[num];
// 让num累加
num ++;
// 考虑数组越界异常
if(num == images.length - 1){
num = 0;
}
while (true){
if(ff < 100f){
ff += 1f;
// 调用重绘方法。慢慢绘制图片,图片越来越清晰
repaint();
}else {
ff = 0f;
break; // 跳出循环,方法执行结束,整个线程就执行结束
}
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}).start();
}
// 需要重写父类的方法。提供绘图的方法。ctrl + o:打开重写方法
@Override
public void paint(Graphics g) {
super.paint(g);
// Graphics转换为子类对象,子类提供了更多的方法
Graphics2D graphics2D = (Graphics2D) g;
if(bgImage != null){
// 加入淡入效果,设置图片的显示比例(模糊度)
graphics2D.setComposite(AlphaComposite.SrcOver.derive(ff / 100f));
// 把图片画到窗口上。0,0表示从最左上角开始画
graphics2D.drawImage(bgImage,0,0, bgImage.getWidth(), bgImage.getHeight(),null);
}
}
// 定义图片类型数组
// BufferedImage:表示图片对象
BufferedImage[] images = new BufferedImage[9];
/**
* 加载提前准备好的一些图片
*/
public void initImgs() throws IOException {
for (int i = 0; i < images.length; i++) {
// 每循环异常,都要加载一张图片 /main/java/cn/tx/snow/images/bg" + i + ".png
URL url = MyImage.class.getResource("main/java/cn/tx/snow/images/bg" + i + ".png"); // 返回null
File file = new File("src/main/java/cn/tx/snow/images/img_" + i + ".png");
URL url1 = file.toURL();
BufferedImage image = ImageIO.read((Objects.requireNonNull(url1)));
// 每读取到一张图片对象,把它存放到数组中
images[i] = image;
}
}
}