Java 3 Color Gradient

我有一个JPanel ,我想在其中绘制一个渐变。 我有下面的代码,但只绘制了2色渐变。 我想添加第3个但不知道如何。 我想要的是让面板的左上角为白色,右上角为红色,两个底角为黑色。 我需要做些什么来实现这一点,看起来像这样:

示例渐变

 package pocketshop.util; import java.awt.Color; import java.awt.GradientPaint; import java.awt.Graphics; import java.awt.Graphics2D; import javax.swing.JPanel; public class ColorPicker extends JPanel{ public ColorPicker(){ repaint(); } @Override public void paintComponent(Graphics g){ super.paintComponent(g); Graphics2D g2d = (Graphics2D)g; int w = getWidth(); int h = getHeight(); GradientPaint gp = new GradientPaint( 0, 0, Color.white, 0, h, Color.black); g2d.setPaint(gp); g2d.fillRect(0, 0, w, h); } } 

编辑:可能的解决方案

我能够想出使用2个渐变,一个水平和一个垂直,像这样:

  public void paintComponent(Graphics g){ super.paintComponent(g); Graphics2D g2d = (Graphics2D)g; int w = getWidth(); int h = getHeight(); // Vertical GradientPaint gp = new GradientPaint( 0, 0, new Color(0,0,0,0), 0, h, Color.black); // Horizontal GradientPaint gp2 = new GradientPaint( 0, 0, Color.white, w, 0, Color.red, true); g2d.setPaint(gp2); g2d.fillRect(0, 0, w, h); g2d.setPaint(gp); g2d.fillRect(0, 0, w, h); } 

像这样的东西?

三向色彩渐变

 import java.awt.*; import java.awt.image.BufferedImage; import java.io.*; import javax.imageio.ImageIO; import javax.swing.*; public class ThreeWayGradient { public static void main(String[] args) { final BufferedImage image = new BufferedImage( 200, 200, BufferedImage.TYPE_INT_RGB); Runnable r = new Runnable() { @Override public void run() { Graphics2D g = image.createGraphics(); GradientPaint primary = new GradientPaint( 0f, 0f, Color.WHITE, 200f, 0f, Color.ORANGE); GradientPaint shade = new GradientPaint( 0f, 0f, new Color(0, 0, 0, 0), 0f, 200f, new Color(0, 0, 0, 255)); g.setPaint(primary); g.fillRect(0, 0, 200, 200); g.setPaint(shade); g.fillRect(0, 0, 200, 200); JLabel l = new JLabel(new ImageIcon(image)); JOptionPane.showMessageDialog(null, l); File f = new File(System.getProperty("user.home"), "ThreeWayGradient.png"); try { ImageIO.write(image, "png", f); } catch (IOException ex) { ex.printStackTrace(); } } }; SwingUtilities.invokeLater(r); } } 

使其成为一种工厂方法

因为它更漂亮。

ThreeWayGradient作为工厂方法

 import java.awt.*; import java.awt.image.BufferedImage; import javax.swing.*; public class ThreeWayGradient { public static BufferedImage getThreeWayGradient( int size, Color primaryLeft, Color primaryRight, Color shadeColor) { BufferedImage image = new BufferedImage( size, size, BufferedImage.TYPE_INT_RGB); Graphics2D g = image.createGraphics(); GradientPaint primary = new GradientPaint( 0f, 0f, primaryLeft, size, 0f, primaryRight); int rC = shadeColor.getRed(); int gC = shadeColor.getGreen(); int bC = shadeColor.getBlue(); GradientPaint shade = new GradientPaint( 0f, 0f, new Color(rC, gC, bC, 0), 0f, size, shadeColor); g.setPaint(primary); g.fillRect(0, 0, size, size); g.setPaint(shade); g.fillRect(0, 0, size, size); g.dispose(); return image; } /** * Presumed to have a layout that shows multiple components. */ public static void addGradient( JPanel p, int s, Color pL, Color pR, Color sh) { JLabel l = new JLabel(new ImageIcon(getThreeWayGradient(s, pL, pR, sh))); p.add(l); } public static void main(String[] args) { Runnable r = new Runnable() { @Override public void run() { JPanel gui = new JPanel(new GridLayout(2,4,1,1)); addGradient(gui,100,Color.YELLOW,Color.RED,Color.GREEN); addGradient(gui,100,Color.GREEN,Color.YELLOW,Color.RED); addGradient(gui,100,Color.RED,Color.GREEN,Color.YELLOW); addGradient(gui,100,Color.BLUE,Color.MAGENTA,Color.PINK); addGradient(gui,100,Color.WHITE,Color.RED,Color.BLACK); addGradient(gui,100,Color.RED,Color.GREEN,Color.BLACK); addGradient(gui,100,Color.BLUE,Color.PINK,Color.BLACK); addGradient(gui,100,Color.BLUE,Color.CYAN,Color.BLACK); JOptionPane.showMessageDialog(null, gui); } }; SwingUtilities.invokeLater(r); } } 

看看LinearGradientPaint ,它允许您指定n个颜色及其权重。

更新1

随着需求的“小”变化,如果GradientPant LinearGradientPaint对性能有任何显着影响,那么值得商榷。

我强烈建议你看一下Harmonic Code 。 这个人做了一些非常有趣的post,还有一些关于渐变。 ;)

更新2

知道我在Bilinear颜色插值之前看过类似的东西。