Java 矩形梯度
我正在尝试为我的用户界面中的某些东西实现一个Java 矩形梯度,java,draw,gradient,Java,Draw,Gradient,我正在尝试为我的用户界面中的某些东西实现一个draw(graphics2dg)方法。它不是一个swing组件,我自己画。我正试图创建一个像这样的图像梯度边界 我怎样才能画出一个类似于那个的渐变呢?你并没有具体说明你想要什么,但如果它是我认为的那样,那么它就有点类似于我在书中写的东西 这里的技巧是不创建单个渐变绘制,也不填充单个形状。相反,必须用渐变填充的区域分为8个部分:四个边和四个角。边缘用简单的渐变色颜料填充。拐角处用径向渐变色涂料填充。然后只需要摆弄坐标,但这可以通过一种相当通用的方式来
draw(graphics2dg)
方法。它不是一个swing组件,我自己画。我正试图创建一个像这样的图像梯度边界
我怎样才能画出一个类似于那个的渐变呢?你并没有具体说明你想要什么,但如果它是我认为的那样,那么它就有点类似于我在书中写的东西
这里的技巧是不创建单个渐变绘制,也不填充单个形状。相反,必须用渐变填充的区域分为8个部分:四个边和四个角。边缘用简单的渐变色颜料填充。拐角处用径向渐变色涂料填充。然后只需要摆弄坐标,但这可以通过一种相当通用的方式来完成,当内部形状以矩形2D
给出时
然而,结果可能如下所示:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.MultipleGradientPaint.CycleMethod;
import java.awt.RadialGradientPaint;
import java.awt.Shape;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.awt.geom.RoundRectangle2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class RectangularGradientTest
{
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
createAndShowGUI();
}
});
}
private static void createAndShowGUI()
{
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.getContentPane().add(new RectangularGradientTestPanel());
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
}
class RectangularGradientTestPanel extends JPanel
{
@Override
protected void paintComponent(Graphics gr)
{
super.paintComponent(gr);
Graphics2D g = (Graphics2D)gr;
Rectangle2D r = new Rectangle2D.Double(100,100,200,100);
draw(g, r, 75);
Shape rr = new RoundRectangle2D.Double(80,80,240,140,20,20);
g.setColor(Color.BLACK);
g.fill(rr);
}
@Override
public Dimension getPreferredSize()
{
if (isPreferredSizeSet())
{
return super.getPreferredSize();
}
return new Dimension(400,300);
}
private static void draw(Graphics2D g, Rectangle2D r, double s)
{
Color c0 = new Color(255,0,0);
Color c1 = new Color(255,0,0,0);
double x0 = r.getMinX();
double y0 = r.getMinY();
double x1 = r.getMaxX();
double y1 = r.getMaxY();
double w = r.getWidth();
double h = r.getHeight();
// Left
g.setPaint(new GradientPaint(
new Point2D.Double(x0, y0), c0,
new Point2D.Double(x0 - s, y0), c1));
g.fill(new Rectangle2D.Double(x0 - s, y0, s, h));
// Right
g.setPaint(new GradientPaint(
new Point2D.Double(x1, y0), c0,
new Point2D.Double(x1 + s, y0), c1));
g.fill(new Rectangle2D.Double(x1, y0, s, h));
// Top
g.setPaint(new GradientPaint(
new Point2D.Double(x0, y0), c0,
new Point2D.Double(x0, y0 - s), c1));
g.fill(new Rectangle2D.Double(x0, y0 - s, w, s));
// Bottom
g.setPaint(new GradientPaint(
new Point2D.Double(x0, y1), c0,
new Point2D.Double(x0, y1 + s), c1));
g.fill(new Rectangle2D.Double(x0, y1, w, s));
float fractions[] = new float[] { 0.0f, 1.0f };
Color colors[] = new Color[] { c0, c1 };
// Top Left
g.setPaint(new RadialGradientPaint(
new Rectangle2D.Double(x0 - s, y0 - s, s + s, s + s),
fractions, colors, CycleMethod.NO_CYCLE));
g.fill(new Rectangle2D.Double(x0 - s, y0 - s, s, s));
// Top Right
g.setPaint(new RadialGradientPaint(
new Rectangle2D.Double(x1 - s, y0 - s, s + s, s + s),
fractions, colors, CycleMethod.NO_CYCLE));
g.fill(new Rectangle2D.Double(x1, y0 - s, s, s));
// Bottom Left
g.setPaint(new RadialGradientPaint(
new Rectangle2D.Double(x0 - s, y1 - s, s + s, s + s),
fractions, colors, CycleMethod.NO_CYCLE));
g.fill(new Rectangle2D.Double(x0 - s, y1, s, s));
// Bottom Right
g.setPaint(new RadialGradientPaint(
new Rectangle2D.Double(x1 - s, y1 - s, s + s, s + s),
fractions, colors, CycleMethod.NO_CYCLE));
g.fill(new Rectangle2D.Double(x1, y1, s, s));
}
}
你试过从红色开始,然后逐渐变为白色吗?我见过的唯一渐变要么是线性的,要么是径向的,但我从来没有见过一个向外呈矩形的渐变,所以我不完全确定如何做到这一点。你总是可以创建自己的绘制派生类来实现这一点。如果这是您希望选择的路径,那么请查看Java的源代码,了解Paint、GradientPaint以及类似的类和接口。