具有半透明/抗锯齿的光标

时间:2011-11-29 12:00:42

标签: java eclipse

我正在尝试使用以下代码创建自定义光标:

BufferedImage cursor = new BufferedImage(30, 30, BufferedImage.TYPE_INT_ARGB);
Graphics2D g = (Graphics2D) cursor.getGraphics();
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g.setColor(Color.BLACK);
g.drawOval(0, 0, 26, 26);
jframe.getContentPane().setCursor(Toolkit.getDefaultToolkit().createCustomCursor(
    cursor, new Point(13, 13), "cursor"));

没有Anti-Aliasing这看起来非常糟糕,但是一旦我尝试激活Anti-Aliasing,那些应该是半透明的像素似乎变得完全可靠 - 好像JFrame光标无法处理半透明度。

我尝试从BufferedImage文件加载.png,但结果是一样的。

我不想在画布上手动绘制光标,因为与此方法相比,它有一个轻微的输入延迟

我想做的就是拥有一个可以支持半透明的Cursor。 关于如何实现这个目标的任何想法?

提前致谢。

2 个答案:

答案 0 :(得分:1)

这个很微妙(我已经被困了几年:)但我今天已经破解了它。

光标似乎仅支持透明度的开/关,因此首先绘制TYPE_INT_RGB图像,然后将其复制到TYPE_INT_ARGB(然后修复透明度)。

不确定它是否是最佳的,但对于像这样的小图像来说并不重要。

        int size = 32;

        /*
         * we need two buffered images as the cursor only supports on/off for alpha
         * 
         * so we need to draw to an image without alpha support
         * then draw that to one with alpha support
         * then make "white" transparent
         */
        BufferedImage image = new BufferedImage(size, size,
                BufferedImage.TYPE_INT_RGB);
        BufferedImage image2 = new BufferedImage(size, size,
                BufferedImage.TYPE_INT_ARGB);

        Graphics2D g = image.createGraphics();
        Graphics2D g2 = image2.createGraphics();

        g.setColor(Color.white);
        g.fillRect(0, 0, size, size);


        // turn on anti-aliasing.
        g.setStroke(new BasicStroke(4.0f)); // 4-pixel lines
        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
            RenderingHints.VALUE_ANTIALIAS_ON);

        g.setColor(new Color(0.5f, 0f, 0f));
        g.drawOval(3, 3, size-7, size-7);

        g2.drawImage(image,  0, 0, null, null);


        for (int y = 0 ; y < size ; y++) {
            for (int x = 0 ; x < size ; x++) {

                int rgb = image.getRGB(x, y);

                int blue = rgb & 0xff;
                int green = (rgb & 0xff00) >> 8;
                int red = (rgb & 0xff0000) >> 16;
                //int alpha = (rgb & 0xff000000) >> 24;

                if (red == 255 && green == 255 && blue == 255) {
                    // make white transparent
                    image2.setRGB(x, y, 0);
                }

            }
        }

        eraserCursor = Toolkit.getDefaultToolkit().createCustomCursor(
                image2, new Point(size / 2, size / 2), "eraserCursor");

答案 1 :(得分:0)

在我的代码中,为了实现半透明图像,我使用此代码段:

g.setComposite(AlphaComposite.SrcOver.derive(0.8f));
g.drawImage(image, 0, 0, null);
g.setComposite(AlphaComposite.SrcOver);

看看它是否适合你...