Java绘制一个切割成矩形的RadialGradientPaint圆

Java绘制一个切割成矩形的RadialGradientPaint圆,java,graphics,2d,drawing,Java,Graphics,2d,Drawing,我有以下代码来绘制RadialGradientPaint圆: public class Character { public static void draw(Graphics2D g2d){ g2d.setColor(Color.RED); g2d.fillRect(0, 0, 1000, 750); drawVisibilityPolygon(g2d); } private static void drawVisibi

我有以下代码来绘制RadialGradientPaint圆:

public class Character {
    public static void draw(Graphics2D g2d){
        g2d.setColor(Color.RED);
        g2d.fillRect(0, 0, 1000, 750);
        drawVisibilityPolygon(g2d);
    }

    private static void drawVisibilityPolygon(Graphics2D g2d){
        Point center = new Point(1000 / 2, 750 / 2);
        float radius = 200;
        float[] dist = {
            0f,
            1f
        };
        Color[] colors = {
            new Color(0, 0, 0, 0),
            new Color(0, 0, 0, 255)
        };
        drawGradientCircle(g2d, radius, dist, colors, center);
    }

    private static void drawGradientCircle(Graphics2D g2d, float radius, float[] dist, Color[] colors, Point2D center){
        RadialGradientPaint rgp = new RadialGradientPaint(center, radius, dist, colors);
        g2d.setPaint(rgp);
        g2d.fill(new Ellipse2D.Double(center.getX() - radius, center.getY() - radius, radius * 2, radius * 2));
    }
}
显示类调用draw方法:

public class Display extends JPanel {
    @Override
    public void paintComponent(Graphics g){
        // SETUP
        BufferedImage base = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_ARGB);
        Graphics2D g2d = base.createGraphics();
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
        g2d.setColor(Color.WHITE);
        g2d.fillRect(0, 0, getWidth(), getHeight());

        // DRAW STUFF
        Character.draw(g2d);

        // FINISH UP
        g.drawImage(base, 0, 0, null);
        g2d.dispose();
        g.dispose();
    }
}
显示类包含在JFrame中:

public class Window extends JFrame {
    private Display display = new Display();

    public Window(String title, int width, int height){
        super(title);
        add(display);
        setSize(width, height);
        setIgnoreRepaint(false);
        setLocationRelativeTo(null);
        setResizable(false);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setVisible(true);
    }

    public Display getDisplay() {
        return display;
    }
}

这很好,但是我想用颜色填充圆外的部分(并且只填充该部分)

我尝试过使用AlphaComposite,但我不知道如何使用它来实现这一点。我可以只画一个更大的圆并减小dist1值,但这需要花费太长的时间来绘制(在我的机器上大约是10毫秒,而在图像中是2毫秒)。我正试着把它放到一个游戏中

我该怎么办?提前谢谢,如果这有一个明显的解决办法,我很抱歉,但我就是不能把我的手指放在它


如果您需要更多信息,请询问。

使用非不透明颜色绘制会导致背景显示,因此您必须设置背景,因此您必须设置适当的背景
看看这个演示:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.RadialGradientPaint;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Point2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.WindowConstants;
import javax.swing.border.LineBorder;
import javax.swing.border.TitledBorder;

public class APanel extends JPanel{

    APanel(){

        setPreferredSize(new Dimension(600,600));
        setBackground(Color.YELLOW);
        setBorder(new TitledBorder(new LineBorder(new Color(169, 169, 169)),
                "Gradient Circle", TitledBorder.LEADING, TitledBorder.BELOW_TOP, null, null));
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        draw((Graphics2D) g);
    }

    public static void draw(Graphics2D g2d){

        g2d.setColor(Color.RED);
        g2d.fillRect(100,100, 400, 400);
        drawVisibilityCircle(g2d);
    }

    private static void drawVisibilityCircle(Graphics2D g2d){
        Point center = new Point(300, 300);
        float radius = 200;
        float[] dist = { 0f, 1f};
        Color[] colors = { new Color(0, 0, 0, 0), new Color(0, 0, 0, 255)};
        //workaround to prevent background color from showing
        drawBackGroundCircle(g2d, radius, Color.WHITE, center);
        drawGradientCircle(g2d, radius, dist, colors, center);
    }

    private static void drawBackGroundCircle(Graphics2D g2d, float radius, Color color, Point2D center){

        g2d.setColor(color);
        radius -= 1;//make radius a bit smaller to prevent fuzzy edge
        g2d.fill(new Ellipse2D.Double(center.getX() - radius, center.getY()
                                                    - radius, radius * 2, radius * 2));
    }

    private static void drawGradientCircle(Graphics2D g2d, float radius, float[] dist, Color[] colors, Point2D center){
        RadialGradientPaint rgp = new RadialGradientPaint(center, radius, dist, colors);
        g2d.setPaint(rgp);
        g2d.fill(new Ellipse2D.Double(center.getX() - radius, center.getY() - radius, radius * 2, radius * 2));
    }

    public static void main(String[] args){

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        JPanel panel = new APanel();
        frame.getContentPane().add(panel);
        frame.pack();
        frame.setVisible(true);
    }
}

你的意思是你想让红色背景像这样显示?@c是的,没错。(我画的红点只是为了表示游戏中屏幕的中心,它不适用于这个问题)我的印象是这样做会导致圆圈画在红色矩形上,圆圈内部也会是红色的。另外,在我的游戏中,代码包含在JPanel中,我觉得没有必要将其包含在JPanel中。我现在不在我的电脑上,等我在电脑上的时候我会试试。在我发布的代码中,我没有看到红色背景显示在圆圈下。如需更多帮助,请发布您发布的代码,将颜色设置为纯色黑白。我的代码将color0设置为alpha为0的黑色,将color1设置为alpha为255的黑色,从而使圆心透明。我意识到,在编辑之前,我使用了一个类设置,但我的示例中没有包括它。我修好了。