用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - java代码库

java 不规则半透明窗体示例(PNG图片实现)

2013-04-13 作者: 小蜜锋举报

[java]代码库

import java.awt.Graphics;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.Toolkit;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.geom.Area;
import java.awt.image.PixelGrabber;
import java.io.IOException;
import java.util.ArrayList;
import javax.swing.JFrame;
import com.sun.awt.AWTUtilities;
 
/**
 * 不规则窗体示例(PNG图片实现) , 请在jdk-6u10版本以上的版本运行
 *
 * @author Hexen
 */
public class IrregularFormSample extends JFrame {
 
    private static final long serialVersionUID = 1L;
    private Point origin; // 用于移动窗体
    private Image img; // 用来设定窗体不规则样式的图片
 
    public IrregularFormSample() {
        super();
 
        /*
         * 首先初始化一张图片,选择支持Alpha(透明)层的图片格式,如PNG)
         */
        MediaTracker mt = new MediaTracker(this);
        img = Toolkit.getDefaultToolkit().createImage("player.png");
        mt.addImage(img, 0);
        try {
            mt.waitForAll();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
 
        try {
            initialize();// 窗体初始化
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 
    /**
     * 窗体初始化
     *
     * @throws IOException
     */
    private void initialize() throws IOException {
        // 设定窗体大小和图片一样大
        this.setSize(img.getWidth(null), img.getHeight(null));
        // 设定禁用窗体装饰,这样就取消了默认的窗体结构
        this.setUndecorated(true);
        // 初始化用于移动窗体的原点
        this.origin = new Point();
 
        // 调用AWTUtilities的setWindowShape方法设定本窗体为制定的Shape形状
        AWTUtilities.setWindowShape(this, getImageShape(img));
        // 设定窗体可见度
        AWTUtilities.setWindowOpacity(this, 0.8f);
 
        this.setLocationRelativeTo(null);
 
        // 由于取消了默认的窗体结构,所以我们要手动设置一下移动窗体的方法
        addMouseListener(new MouseAdapter() {
            public void mousePressed(MouseEvent e) {
                origin.x = e.getX();
                origin.y = e.getY();
            }
 
            // 窗体上单击鼠标右键关闭程序
            public void mouseClicked(MouseEvent e) {
                if (e.getButton() == MouseEvent.BUTTON3)
                    System.exit(0);
            }
 
            public void mouseReleased(MouseEvent e) {
                super.mouseReleased(e);
            }
 
            @Override
            public void mouseEntered(MouseEvent e) {
                repaint();
            }
        });
 
        addMouseMotionListener(new MouseMotionAdapter() {
            public void mouseDragged(MouseEvent e) {
                Point p = getLocation();
                setLocation(p.x + e.getX() - origin.x, p.y + e.getY()
                        - origin.y);
            }
        });
    }
 
    /**
     * 将Image图像转换为Shape图形
     *
     * @param img
     * @param isFiltrate
     * @return Image图像的Shape图形表示
     * @author Hexen
     */
    public Shape getImageShape(Image img) {
        ArrayList<Integer> x = new ArrayList<Integer>();
        ArrayList<Integer> y = new ArrayList<Integer>();
        int width = img.getWidth(null);// 图像宽度
        int height = img.getHeight(null);// 图像高度
 
        // 筛选像素
        // 首先获取图像所有的像素信息
        PixelGrabber pgr = new PixelGrabber(img, 0, 0, -1, -1, true);
        try {
            pgr.grabPixels();
        } catch (InterruptedException ex) {
            ex.getStackTrace();
        }
        int pixels[] = (int[]) pgr.getPixels();
 
        // 循环像素
        for (int i = 0; i < pixels.length; i++) {
            // 筛选,将不透明的像素的坐标加入到坐标ArrayList x和y中
            int alpha = getAlpha(pixels[i]);
            if (alpha == 0) {
                continue;
            } else {
                x.add(i % width > 0 ? i % width - 1 : 0);
                y.add(i % width == 0 ? (i == 0 ? 0 : i / width - 1) : i / width);
            }
        }
 
        // 建立图像矩阵并初始化(0为透明,1为不透明)
        int[][] matrix = new int[height][width];
        for (int i = 0; i < height; i++) {
            for (int j = 0; j < width; j++) {
                matrix[i][j] = 0;
            }
        }
 
        // 导入坐标ArrayList中的不透明坐标信息
        for (int c = 0; c < x.size(); c++) {
            matrix[y.get(c)][x.get(c)] = 1;
        }
 
        /*
         * 逐一水平"扫描"图像矩阵的每一行,将不透明的像素生成为Rectangle,再将每一行的Rectangle通过Area类的rec对象进行合并,
         * 最后形成一个完整的Shape图形
         */
        Area rec = new Area();
        int temp = 0;
 
        for (int i = 0; i < height; i++) {
            for (int j = 0; j < width; j++) {
                if (matrix[i][j] == 1) {
                    if (temp == 0)
                        temp = j;
                    else if (j == width) {
                        if (temp == 0) {
                            Rectangle rectemp = new Rectangle(j, i, 1, 1);
                            rec.add(new Area(rectemp));
                        } else {
                            Rectangle rectemp = new Rectangle(temp, i,
                                    j - temp, 1);
                            rec.add(new Area(rectemp));
                            temp = 0;
                        }
                    }
                } else {
                    if (temp != 0) {
                        Rectangle rectemp = new Rectangle(temp, i, j - temp, 1);
                        rec.add(new Area(rectemp));
                        temp = 0;
                    }
                }
            }
            temp = 0;
        }
        return rec;
    }
 
    /**
     * 获取像素的Alpha值
     *
     * @param pixel
     * @return 像素的Alpha值
     */
    private int getAlpha(int pixel) {
        return (pixel >> 24) & 0xff;
    }
 
    @Override
    public void paint(Graphics g) {
        // super.paint(g); //运行此行会导致鼠标进入窗体时窗口闪烁
        g.drawImage(img, 0, 0, null);
    }
 
    public static void main(String[] args) {
        IrregularFormSample sample = new IrregularFormSample();
        sample.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        sample.setVisible(true);
    }
}

[代码运行效果截图]


java 不规则半透明窗体示例(PNG图片实现)


网友评论    (发表评论)

共1 条评论 1/1页

发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...