Круглый GradientPaint заполнить демо



java.awt



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 = (Graphics2Dg;

    RoundRectangle2D r = new RoundRectangle2D.Float(5515015025,

        25);

    RoundGradientPaint rgp = new RoundGradientPaint(7575, Color.magenta,

        new Point2D.Double(085), 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(200200);

    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(00<= 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(00);

          double ratio = distance / radius;

          if (ratio > 1.0)

            ratio = 1.0;



          int base = (j * w + i4;

          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(00, w, h, data);



      return raster;

    }

  }

}

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>