import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Paint;
import java.awt.PaintContext;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.geom.AffineTransform;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.awt.geom.RoundRectangle2D;
import java.awt.image.ColorModel;
import java.awt.image.Raster;
import java.awt.image.WritableRaster;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class RoundGradientPaintFill extends JPanel{
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
RoundRectangle2D r = new RoundRectangle2D.Float(5, 5, 150, 150, 25,
25);
RoundGradientPaint rgp = new RoundGradientPaint(75, 75, Color.magenta,
new Point2D.Double(0, 85), Color.blue);
g2.setPaint(rgp);
g2.fill(r);
}
public static void main(String[] args) {
JFrame f = new JFrame();
f.getContentPane().add(new RoundGradientPaintFill());
f.setSize(200, 200);
f.show();
}
class RoundGradientPaint implements Paint {
protected Point2D point;
protected Point2D mRadius;
protected Color mPointColor, mBackgroundColor;
public RoundGradientPaint(double x, double y, Color pointColor,
Point2D radius, Color backgroundColor) {
if (radius.distance(0, 0) <= 0)
throw new IllegalArgumentException("Radius must be greater than 0.");
point = new Point2D.Double(x, y);
mPointColor = pointColor;
mRadius = radius;
mBackgroundColor = backgroundColor;
}
public PaintContext createContext(ColorModel cm, Rectangle deviceBounds,
Rectangle2D userBounds, AffineTransform xform, RenderingHints hints) {
Point2D transformedPoint = xform.transform(point, null);
Point2D transformedRadius = xform.deltaTransform(mRadius, null);
return new RoundGradientContext(transformedPoint, mPointColor,
transformedRadius, mBackgroundColor);
}
public int getTransparency() {
int a1 = mPointColor.getAlpha();
int a2 = mBackgroundColor.getAlpha();
return (((a1 & a2) == 0xff) ? OPAQUE : TRANSLUCENT);
}
}
public class RoundGradientContext implements PaintContext {
protected Point2D mPoint;
protected Point2D mRadius;
protected Color color1, color2;
public RoundGradientContext(Point2D p, Color c1, Point2D r, Color c2) {
mPoint = p;
color1 = c1;
mRadius = r;
color2 = c2;
}
public void dispose() {
}
public ColorModel getColorModel() {
return ColorModel.getRGBdefault();
}
public Raster getRaster(int x, int y, int w, int h) {
WritableRaster raster = getColorModel().createCompatibleWritableRaster(
w, h);
int[] data = new int[w * h * 4];
for (int j = 0; j < h; j++) {
for (int i = 0; i < w; i++) {
double distance = mPoint.distance(x + i, y + j);
double radius = mRadius.distance(0, 0);
double ratio = distance / radius;
if (ratio > 1.0)
ratio = 1.0;
int base = (j * w + i) * 4;
data[base + 0] = (int) (color1.getRed() + ratio
* (color2.getRed() - color1.getRed()));
data[base + 1] = (int) (color1.getGreen() + ratio
* (color2.getGreen() - color1.getGreen()));
data[base + 2] = (int) (color1.getBlue() + ratio
* (color2.getBlue() - color1.getBlue()));
data[base + 3] = (int) (color1.getAlpha() + ratio
* (color2.getAlpha() - color1.getAlpha()));
}
}
raster.setPixels(0, 0, w, h, data);
return raster;
}
}
}
|