Java 让图片动起来

rotate(double theta)
 

Java 中的rotate()方法详解

rotate(double theta)是 Java 2D 图形 API 中的一个变换方法,它可以让你对绘制的内容进行旋转。这个方法属于Graphics2D类,是 Java Swing 和 AWT 中用于高级绘图的工具。

参数解释
  • theta:旋转角度,以弧度为单位。
    • 正角度表示顺时针旋转
    • 负角度表示逆时针旋转
    • 例如:Math.PI/2(约 1.57)表示旋转 90 度
注意事项
  • 旋转操作会影响后续绘制的所有内容
  • 默认旋转中心是坐标原点 (0,0),通常是窗口左上角
  • 可以通过rotate(theta, x, y)指定旋转中心点
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.awt.geom.AffineTransform;
    import java.io.File;
    import javax.imageio.ImageIO;
    
    public class ImageRotationDemo extends JPanel implements ActionListener {
        private Image image;           // 要旋转的图片
        private double angle = 0;      // 当前旋转角度(弧度)
        private Timer timer;           // 用于定时更新旋转角度
        private int centerX, centerY;  // 旋转中心点
        
        public ImageRotationDemo() {
            try {
                // 加载图片(请确保路径正确)
                image = ImageIO.read(new File("src/a1.png"));
                // 如果没有图片,显示错误信息
                if (image == null) {
                    throw new Exception("图片未找到");
                }
            } catch (Exception e) {
                e.printStackTrace();
                JOptionPane.showMessageDialog(this, "无法加载图片: " + e.getMessage());
            }
            
            // 创建按钮控制旋转
            JButton rotateButton = new JButton("旋转图片");
            rotateButton.addActionListener(e -> {
                if (timer.isRunning()) {
                    timer.stop();
                    rotateButton.setText("继续旋转");
                } else {
                    timer.start();
                    rotateButton.setText("暂停旋转");
                }
            });
            
            // 添加按钮到面板
            JPanel buttonPanel = new JPanel();
            buttonPanel.add(rotateButton);
            
            // 设置主面板布局
            setLayout(new BorderLayout());
            add(buttonPanel, BorderLayout.NORTH);
            
            // 创建定时器,每50毫秒触发一次更新
            timer = new Timer(50, this);
            timer.start();
        }
        
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            
            if (image != null) {
                // 获取Graphics2D对象,用于高级绘图
                Graphics2D g2d = (Graphics2D) g;
                
                // 启用抗锯齿,使旋转后的图片更平滑
                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
                                    RenderingHints.VALUE_ANTIALIAS_ON);
                
                // 计算图片的中心点
                centerX = getWidth() / 2;
                centerY = getHeight() / 2;
                
                // 保存当前的图形状态
                AffineTransform originalTransform = g2d.getTransform();
                
                // 移动坐标系到图片中心
                g2d.translate(centerX, centerY);
                
                // 旋转坐标系
                g2d.rotate(angle);
                
                // 绘制图片,注意坐标要调整为相对于中心点的位置
                g2d.drawImage(image, 
                             -image.getWidth(this) / 2,  // X坐标:负的图片宽度的一半
                             -image.getHeight(this) / 2, // Y坐标:负的图片高度的一半
                             this);
                
                // 恢复原始的图形状态,确保后续绘制不受影响
                g2d.setTransform(originalTransform);
                
                // 显示当前旋转角度(转换为度数)
                g2d.drawString("旋转角度: " + Math.round(Math.toDegrees(angle)) + "°", 
                              10, 20);
            } else {
                g.drawString("图片未加载", 50, 50);
            }
        }
        
        @Override
        public void actionPerformed(ActionEvent e) {
            // 每次定时器触发时,增加旋转角度
            angle += 0.05;  // 每次增加0.05弧度(约2.86度)
            
            // 如果角度超过2π(一圈),则重置,避免数值过大
            if (angle > 2 * Math.PI) {
                angle -= 2 * Math.PI;
            }
            
            // 重绘面板,显示新的旋转角度
            repaint();
        }
        
        public static void main(String[] args) {
            JFrame frame = new JFrame("图片旋转演示");
            ImageRotationDemo demo = new ImageRotationDemo();
            frame.add(demo);
            frame.setSize(600, 600);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        }
    }

  • 坐标变换

    • translate(x, y):移动坐标系原点到 (x,y)
    • rotate(angle):绕当前原点旋转坐标系
    • 这两个操作会影响后续所有的绘图命令
  • 保存和恢复图形状态

    • 使用AffineTransform保存当前变换状态
    • 旋转完成后恢复状态,避免影响其他绘图
  • 角度计算

    • Java 使用弧度而非度数(180 度 = π 弧度)
    • 使用Math.toDegrees()将弧度转换为度数显示
  • 动画实现

    • 使用Timer定期更新旋转角度
    • 调用repaint()触发重绘,产生动画效果
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值