2017-11-10 247 views
2

我有以下代码来绘制的RadialGradientPaint圆:Java画的RadialGradientPaint圆切成矩形

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(); 
    } 
} 

的显示类:

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)); 
    } 
} 

拉伸方法由Display类称为包含在一个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; 
    } 
} 

enter image description here

这工作正常,但我想用一种颜色来填充圆圈外部分(只有那部分)。

我试过使用AlphaComposite,但我不知道如何使用它来做到这一点。我可以制作一个更大的圆圈并减小dist1值,但绘制需要很长时间(我的机器上大约需要10ms,而不是图像中圆圈的2ms)。我正试图把它变成游戏。

我该怎么办?非常感谢,如果这有一个明显的解决方案,但我不能把它放在手指上。

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

+0

你的意思是你想要的红色背景显示像[这](https://imgur.com/IJrVCSP)? – c0der

+0

@ c0der确实(我画的红点只是表示游戏中的屏幕中心,它没有发布到这个问题) – Tom

回答

1

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

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); 
    } 
} 

enter image description here

+0

我的印象是这样做会导致圆圈画在红色的矩形,圆的内部也会变成红色。此外,该代码包含在我的游戏中的一个JPanel内,我觉得没有必要包含这个代码。我现在不在我的电脑上,我会在我试用时试用。 – Tom

+0

是的,它是如我所料:http://prntscr.com/h90onv – Tom

+0

我没有看到红色背景显示在我发布的代码圈下。如需更多帮助,请发布[MCVE] – c0der