16. 3. 11. 剪切渐变合成及鼠标移动Translate and rotate all objects

16. 3. 11. 剪切渐变合成及鼠标移动Translate and rotate all objects

import java.awt.AlphaComposite; import java.awt.BasicStroke; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Font; import java.awt.GradientPaint; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.RenderingHints; import java.awt.Shape; import java.awt.Toolkit; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.geom.Ellipse2D; import java.awt.geom.RoundRectangle2D; import javax.swing.JComponent; import javax.swing.JFrame; public class TranslateAndRotateObject extends JComponent{ private Image image; private int theta;//角度 塞塔脑波 希蜡字母的第八字 public TranslateAndRotateObject(){ image = Toolkit.getDefaultToolkit().getImage("E:\\java\\Test\\icon\\44.png");//拿到图片 theta = 0;//角度为0 addMouseListener(new MouseAdapter(){ public void mousePressed(MouseEvent e){//按下鼠标 theta = (theta + 15) % 360;//每次加15度 repaint(); } }); } public void paint(Graphics g){ Graphics2D g2d = (Graphics2D)g; //设置渲染锯齿平滑 ON开 g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); //getSize()从JComponent而来,以 Dimension 对象的形式返回组件的大小。 //Dimension 对象的 height 字段包含此组件的高度, //而 Dimension 对象的 width 字段则包含此组件的宽度。 int cx = getSize().width/2; int cy = getSize().height/2; //====================================================================使图片能旋转 g2d.translate(cx, cy);//平移至指定坐标 //使用正角度 theta 进行旋转,可将正 x 轴上的点转向正 y 轴。 g2d.rotate(theta * Math.PI/180); g2d.drawImage(image, -cx/2, -cy/2, this); //====================================================================画一个渐变椭圆 Shape oldClip = g2d.getClip();//一个形状=g2d.获取当前剪贴区域。 //以 float 精度定义椭圆 根据指定坐标构造和初始化 Ellipse2D。 Shape e = new Ellipse2D.Float(-cx,-cy,cx*2,cy*2); g2d.clip(e); Shape c = new Ellipse2D.Float(-cx,-cy,cx*3/4,cy*2); g2d.setPaint(new GradientPaint(40,40,Color.blue,60,50,Color.white,true)); g2d.fill(c); //=================================================================画一个黄色剪切椭圆 g2d.setPaint(Color.yellow); g2d.fillOval(cx/4, 0, cx, cy);//指定椭圆的坐标与高宽度 g2d.setClip(oldClip); //=================================================================画渐变的大字 g2d.setFont(new Font("Times New Roman", Font.PLAIN, 60)); g2d.setPaint(new GradientPaint(-cx,0,Color.red,cx,0,Color.black,false)); g2d.drawString("Hellow g2d", -cx*3/4, cy/4); //=================================================================设置合成 /** * alpha:阿尔法 透明度 阿尔法系数 composite:合成品 合成 复合 * AlphaComposite:实现一些基本的 alpha 合成规则,将源色与目标色组合,在图形和图像中实现混合和透明效果。 * getInstance():它具有指定的规则和用来乘源色 alpha 值的常量 alpha 值。(合成规则,alpha值) * SRC_OVER:在目标色之上合成源色 */ AlphaComposite ac = AlphaComposite.getInstance(AlphaComposite.SRC_OVER,(float).75); g2d.setComposite(ac); //=====================================================合成两个圆边方形 //RoundRectangle2D.float(坐标x,y,宽高w,h,圆角狐宽高arcW,arcH) Shape r = new RoundRectangle2D.Float(0,-cy*3/4,cx*3/4,cy*3/4,20,20); //Stroke:描边、笔画、轻抚 ----setStoke()呈现过程中用于勾画 Shape 的 Stroke 对象 g2d.setStroke(new BasicStroke(4));//构造一个具有指定线条宽度以及 cap 和 join 风格的默认值的实心 BasicStroke。 g2d.setPaint(Color.magenta);//品红色的 g2d.fill(r); g2d.setPaint(Color.green);//绿色套在品红色周围 g2d.draw(r); } public static void main(String[] args) { JFrame f = new JFrame("TranslateandrotateallObjects"); f.add(new TranslateAndRotateObject(),BorderLayout.CENTER); f.setSize(300,300); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); } }