2013-04-20 66 views
1

我想創建一個圖形,其中圓圈重疊,它們的顏色淡出,也圓應該在對方,類似的事情到這之間有一個空格:enter image description here圈在圈淡出,創建目標

這是多遠我有:

import java.awt.*; 
import java.awt.geom.*; 
import javax.swing.*; 
import java.awt.event.MouseListener; 
import java.awt.event.MouseEvent; 

class Circles extends JPanel implements MouseListener { 


    public void mouseReleased(MouseEvent event) { 

    } 
    public void mousePressed(MouseEvent event) { 

    } 
    public void mouseClicked(MouseEvent event) { 

    } 
    public void mouseEntered(MouseEvent event) {} 
    public void mouseExited(MouseEvent event) {} 


    public Circles() { 
     addMouseListener(this); 
    } 


    public void paint(Graphics g) { 
     g.setColor(Color.white); 
     int w = getWidth(); 
     int h = getHeight(); 
     g.fillRect(0, 0, w, h); 


     Graphics2D g2 = (Graphics2D) g; 

     for (int i = 0; i < 20; i++) { 
      if (i % 2 == 0) { 
       Color c = new Color(255 - i * 10, 255 - i * 10, 255 - i * 10); 
       g2.setColor(c); 
      } else { 
       g2.setColor(Color.white); 
      } 

      g2.fillOval((5 * i), (5 * i), (w - 10) * i, (h - 10) * i); 
     } 
    } 

    public static void main(String[] args) { 
     Frame w = new Frame(); 
     w.setVisible(true); 
    } 
} 

框架:

import java.awt.*; 
import java.awt.geom.*; 
import javax.swing.*; 


public class Frame extends JFrame { 
    Circles myPanel; 

    public static void main(String[] args) { 
     Frame w = new Frame(); 
     w.setVisible(true); 
    } 

    public Frame() { 
     setTitle("In-class Test 1: Starting Code"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setSize(500, 220); 
     setLocation(300, 300); 
     myPanel = new Circles(); 
     add(myPanel); 
    } 
} 
+0

你想創建一個'Target'? – Justin 2013-04-20 22:32:39

+0

你可以這麼說:-) – Waj 2013-04-20 22:35:36

+0

你可能會在這裏得到你想要的:[Compositing Graphics](http://docs.oracle.com/javase/tutorial/2d/advanced/compositing.html) – Justin 2013-04-20 22:37:03

回答

2

有許多的方式來實現這一點,但第一,overrid啓動正在paintComponent而不是paint

其次,您需要某種循環來擴展每次迭代的圓的半徑。

第三,你需要一個簡單的int值作爲一個alpha值,從255開始,降低到你想要的最弱的alpha級別,或許是64的例子。

在循環的每次迭代中,都需要相應地增加半徑值並減小alpha值。然後,您就只需要創建一個新的Color對象與你需要的RGB & alpha值

退房2D Graphics與例如更新細節

...

enter image description here

import java.awt.BasicStroke; 
import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.RenderingHints; 
import java.awt.geom.Ellipse2D; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class FadingCircles { 

    public static void main(String[] args) { 
     new FadingCircles(); 
    } 

    public FadingCircles() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Test"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 

     }); 
    } 

    public static class TestPane extends JPanel { 

     public static final int CIRCLE_COUNT = 10; 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(200, 200); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2d = (Graphics2D) g.create(); 

      g2d.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY); 
      g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
      g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY); 
      g2d.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_ENABLE); 
      g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON); 
      g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); 
      g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); 
      g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE); 

      int maxRadius = Math.min(getWidth(), getHeight()); 
      int alpha = 255; 
      int range = 255 - 32; 
      g2d.setStroke(new BasicStroke(6, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)); 

      for (int index = 0; index < CIRCLE_COUNT; index++) { 
       float progress = (float) index/(float) CIRCLE_COUNT; 
       alpha = 255 - Math.round(range * progress); 
       Color color = new Color(0, 0, 0, alpha); 
       g2d.setColor(color); 

       int radius = Math.round(maxRadius * progress); 
       int x = (getWidth() - radius)/2; 
       int y = (getHeight() - radius)/2; 

       g2d.draw(new Ellipse2D.Float(x, y, radius, radius)); 
      } 
      g2d.dispose(); 
     } 
    } 
} 

您可能還喜歡退房Performing Custom Painting

+0

非常感謝說明。 – Waj 2013-04-21 18:50:40

+0

+1,我的眼睛瘋狂地看着這個。 – camickr 2013-06-06 15:25:49