程序员的眼睛长时间盯着计算机屏幕,很容易导致眼睛疲劳,且在办公室看不了远处,于是想起了视疲劳缓解图,又叫远眺图。用程序员的方法,在自己喜欢的壁纸上绘制这个远眺图,把远眺图搬到桌面上。但是不能一直显示在桌面上,那样就看不到自己喜欢的壁纸了,将桌面壁纸设置为幻灯片放映,让远眺图每隔一段时间显示几分钟。因为工作时主要使用外接显示器,笔记本的显示屏经常是空闲的,当发现笔记本桌面出现了远眺图时,就可以抽空看一会儿。至于每隔多久显示多久,我的做法是将没有远眺图的壁纸复制几份,文件名使用数字顺序编号,至于复制几份,就结合幻灯片切换时间来定吧。
以下是该功能的Java代码:
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class AddDistantView {
static final int initLineWidth = 45; // 最外绿框线条宽度
static final int reduceWidth = 1; // 线条每次减少宽度
static final int reduceEveryFewLayers = 1; // 每几层减少一次线条宽度
static final int taskbarWidth = 100; // 任务栏宽度,远眺图不绘制到任务栏区域
static final Position taskbarPosition = Position.Down; // 任务栏位置
// 打开壁纸,绘制远眺图,并另存
public static void main(String[] args) throws IOException {
// 弹出文件选择框,选择壁纸文件
FileDialog fileDialog = new FileDialog(new Frame(), "选择壁纸", FileDialog.LOAD);
fileDialog.setVisible(true);
if (fileDialog.getFile() == null) {
System.exit(0);
}
String fileName = fileDialog.getFile();
String path = fileDialog.getDirectory() + fileName;
BufferedImage image = ImageIO.read(new File(path));
paint(image, false);
String formatName = fileName.substring(fileName.lastIndexOf(".") + 1);
// 弹出文件选择框,选择保存路径
fileDialog = new FileDialog(new Frame(), "选择保存路径", FileDialog.SAVE);
fileDialog.setFile(fileName);
fileDialog.setVisible(true);
if (fileDialog.getFile() == null) {
System.exit(0);
}
path = fileDialog.getDirectory() + fileDialog.getFile();
ImageIO.write(image, formatName, new File(path));
System.exit(0);
}
/**
* 绘制远眺图
* @param image
* @param full
*/
public static void paint(BufferedImage image, boolean full) {
Color[] color = new Color[2];
// 比Color.GREEN鲜艳的绿色
color[0] = new Color(0, 176, 80);
color[1] = Color.WHITE;
int lineWidth = initLineWidth, x = 0, y = 0, w, h;
if (full) {
// 全图绘制
w = image.getWidth();
h = image.getHeight();
} else {
// 正方形区域绘制,且不绘制到任务栏区域
int areaWidth = taskbarPosition.isVertical() ? image.getWidth() : image.getWidth() - taskbarWidth;
int areaHeight = taskbarPosition.isVertical() ? image.getHeight() - taskbarWidth : image.getHeight();
w = Math.min(areaWidth, areaHeight);
h = w;
x = (image.getWidth() - w) / 2;
y = (image.getHeight() - h) / 2;
if (taskbarPosition.isVertical()) {
y += taskbarPosition.value * taskbarWidth / 2;
} else {
x += taskbarPosition.value * taskbarWidth / 2;
}
}
// 绘制绿白间隔框,每层线条宽度逐渐减少
Graphics2D g2D = image.createGraphics();
int i = 0;
while (lineWidth > 0 && w > 0 && h > 0) {
g2D.setColor(color[i % 2]);
g2D.fillRect(x, y, w, h);
i++;
if (i % reduceEveryFewLayers == 0) {
lineWidth -= reduceWidth;
}
x += lineWidth;
y += lineWidth;
w -= 2 * lineWidth;
h -= 2 * lineWidth;
}
g2D.dispose();
}
/**
* 任务栏位置枚举
*/
public enum Position {
Up(1), Down(-1), Left(1), Right(-1);
private int value;
Position(int value) {
this.value = value;
}
/**
* 是否在垂直方向
* @return
*/
public boolean isVertical() {
return this.equals(Up) || this.equals(Down);
}
}
}