Java 模拟放大镜效果

概要:

大家都了解放大镜的基本功能,就是将小的字或图放大,能让人看得清楚。本实例就是一个Java小应用程序(Applet)的例子。使用线程技术,运行小程序就会看到一个图片放大镜的特效,随着放大镜的移动,放大框内的图像就会被放大。

| |目录

技术要点

模拟放大镜效果的技术要点如下:

  • 鼠标移动事件。

  • 双缓冲技术处理图像。

  • 类MediaTracker的使用。

代码实现

package net.xsoftlab.baike;

import java.applet.Applet;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;

public class MaxGlass extends Applet implements MouseMotionListener {
	private static final long serialVersionUID = 2668738824572927683L;

	Graphics g;
	Image image;
	Image back_Image;
	String name;
	MediaTracker tracker;// 声明媒体跟踪器tracker
	int Glass_X = 0, Glass_Y = 0; // 放大镜初始位置
	int Glass_W = 100, Glass_H = 100; // 放大镜宽度、高度
	int width, height;// 声明背景图片的宽度和高度

	@Override
	public void init() {// 初始化applet
		// 加载图片
		this.setSize(600, 300);
		g = getGraphics();
		name = "grid.jpg";
		tracker = new MediaTracker(this);
		back_Image = getImage(getCodeBase(), name);
		image = createImage(250, 100);// 设置放大后的图象的大小
		Graphics offg = image.getGraphics();
		offg.drawImage(back_Image, 0, 0, this);
		addMouseMotionListener(this);// 添加鼠标事件侦听
	}

	public void mouseDragged(MouseEvent e) { // 鼠标拖拽事件处理
	}

	public void mouseMoved(MouseEvent e) {// 处理鼠标移动事件
		reprintGlass(Glass_X, Glass_Y, e.getX(), e.getY());// 通过鼠标位置设置放大镜的位置
		// 设置放大镜的当前位置
		Glass_X = e.getX();
		Glass_Y = e.getY();
		// 若放大镜溢出applet则进行调整
		if (Glass_X > (width - Glass_W / 2))
			Glass_X = width - Glass_W / 2;
		if (Glass_Y > (height - Glass_H / 2))
			Glass_Y = height - Glass_H / 2;
		printGlass();// 调用自定义方法--输出放大镜
	}

	void printGlass() {
		Graphics temp = g.create();// 复制g的一个实例
		temp.clipRect(Glass_X, Glass_Y, Glass_W, Glass_H);// 为temp限制一个矩形区域
		temp.drawImage(back_Image, -Glass_X, -Glass_Y, width * 2, height * 2, null);// 输出放大后的图象
		g.setColor(Color.black);// 设置放大镜边框的颜色
		g.drawRect(Glass_X, Glass_Y, Glass_W - 1, Glass_H - 1);// 输出放大镜边框
	}

	void reprintGlass(int X, int Y, int new_X, int new_Y) {// 清除已经画过的矩形框和放大的图象
		Graphics temp = g.create();// 同上
		if (new_X <= X && new_Y <= Y) {
			temp.clipRect(new_X, new_Y + Glass_H, Glass_W + X - new_X, Y - new_Y);
			temp.drawImage(image, 0, 0, null);
			temp = g.create();
			temp.clipRect(new_X + Glass_W, new_Y, X - new_X, Glass_H + Y - new_Y);
			temp.drawImage(image, 0, 0, null);
		} else if (new_X > X && new_Y <= Y) {
			temp.clipRect(X, new_Y + Glass_H, Glass_W + new_X - X, Y - new_Y);
			temp.drawImage(image, 0, 0, null);
			temp = g.create();
			temp.clipRect(X, new_Y, new_X - X, Glass_H + Y - new_Y);
			temp.drawImage(image, 0, 0, null);
		} else if (new_X > X && new_Y > Y) {
			temp.clipRect(X, Y, Glass_W + new_X - X, new_Y - Y);
			temp.drawImage(image, 0, 0, null);
			temp = g.create();
			temp.clipRect(X, Y, new_X - X, Glass_H + new_Y - Y);
			temp.drawImage(image, 0, 0, null);
		} else {
			temp.clipRect(new_X, Y, Glass_W + X - new_X, new_Y - Y);
			temp.drawImage(image, 0, 0, null);
			temp = g.create();
			temp.clipRect(new_X + Glass_W, Y, X - new_X, Glass_H + new_Y - Y);
			temp.drawImage(image, 0, 0, null);
		}
	}

	@Override
	public boolean imageUpdate(Image img, int infoflags, int x, int y, int w, int h) {// 判断infoflags
																						// 参数是否已完全加载了图像,是则返回
																						// false;否则返回
																						// true
		if (infoflags == ALLBITS) {// ALLBITS指示现在已完成了一幅以前绘制的静态图像,并且可以其最终形式再次绘制它。
			width = back_Image.getWidth(this);
			height = back_Image.getHeight(this);
			image = createImage(width + Glass_W / 2, height + Glass_H / 2);
			Graphics offg = image.getGraphics();
			offg.setColor(Color.white);
			offg.fillRect(0, 0, width + Glass_W / 2, height + Glass_H / 2);
			offg.drawImage(back_Image, 0, 0, this);
			repaint();
			return false;
		} else
			return true;
	}

	@Override
	public void paint(Graphics g) {
		// 输出背景图片
		g.drawImage(back_Image, 0, 0, this);
		// 画放大镜
		printGlass();
	}
}

程序解读

  1. Mouse移动事件,鼠标移动主要通过接口MouseMotionListener来实现,mouse-Dragged()当用户按下鼠标按钮,并在松开之前进行移动时发生;在mouseDragged()后松开鼠标不会导致mouseClicked();mouseMoved()当鼠标在组件上移动而不是拖动时发生。

  2. 初始化Applet,addMouseMotion-Listener(this):添加鼠标事件监听。

  3. 实现放大镜特效,通过该构造方法void printGlass()复制g的一个实例:

temp=g.create():为temp限制一个矩形区域。
temp.clipRect(boxX,boxY,boxW,boxH):输出放大后的图像。
temp.drawImage(back,-boxX,-boxY,width*2,height*2,mull):输出放大镜边框。
g.setColor(Color.white):g.drawRect(boxX,boxY,boxW-1,boxH-1).


评论关闭
评论 还能输入200
评论关闭
评论 还能输入200
  • 全部评论(0)
资料加载中...
已关注 , 取消