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);
}
}