SSISO Community

시소당

Round GradientPaint Fill demo

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;
        }
    }
    
}
[2008년  03월  13일  21:01:38  수정되었습니다.]

553 view

4.0 stars