0
点赞
收藏
分享

微信扫一扫

Java语言程序设计——篇十五(5)

扶摇_hyber 2024-08-22 阅读 20

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

动画

动画

  • 在JavaFX中使用javafx.animation包中的API可实现动画。
  • JavaFX支持两种不同的方法来创建动画。
    ① 过渡动画
    ② 时间轴动画

过渡动画

  • 最简单的动画可以通过过渡效果实现,使用特定的过渡类,定义有关属性值,然后把它应用到某种节点,最后播放动画(调用过渡对象的play()方法)即可。
  • JavaFX提供了一些类方便地实现常见的动画效果。
  • 常用的过渡效果类:
  • 它们是javafx.animation.Animation的子类,该类中定义了动画的基本操作。
  • 该类中定义了一些属性:

淡出效果

  • 使用FadeTransition类通过改变节点的透明度实现目标节点的逐渐消失效果,再通过setAutoReverse()方法实现节点的或隐或现效果。
  • 构造方法:

实战演练

示例:使用文本实现淡入淡出。
在这里插入图片描述

  • 核心代码:
    在这里插入图片描述

移动效果

  • 使用PathTransition类可制作一个在给定时间内,节点沿着一条路径从一个端点到另外一个端点的移动动画。路径通过形状(Shape)对象指定。
  • PathTransition类的常用构造方法如下:
 PathTransition(Duration duration, Shape shape)
 PathTransition(Duration duration, Shape shape, Node node)
  • 属性:

实战演练

问题描述: 使用一个图片实现按路径移动同时播放音乐的效果。
在这里插入图片描述
核心代码:
在这里插入图片描述

缩放效果

  • 使用ScaleTransition类可以实现节点大小的缩放。
  • 构造方法:
    ScaleTransition(Duration duration)
    ScaleTransition(Duration duration, Node node)

实战演练

示例:在3秒内将一个文本的水平宽度和垂直高度增加80%。
核心代码:
在这里插入图片描述

旋转效果

  • 使用RotateTransition类可以实现对节点按指定的角度进行旋转。
  • 构造方法:
   RotateTransition(Duration duration)
   RotateTransition(Duration duration, Node node)
  • 通过setByAngle()方法设置节点旋转的角度,如果参数为正值沿顺时针旋转,负值则沿逆时针旋转。

实战演练

问题描述:
在3秒内将一个文本顺时针旋转360度。
在这里插入图片描述
核心代码:
在这里插入图片描述

综合实例

展示了如何对一个图片进行移动、缩放和旋转:

import javax.swing.*;  
import java.awt.*;  
import java.awt.event.ActionEvent;  
import java.awt.event.ActionListener;  
import java.awt.geom.AffineTransform;  
  
public class AnimationExample extends JPanel implements ActionListener {  
    private Timer timer;  
    private double angle = 0;  
    private double scale = 1.0;  
    private int x = 0, y = 0;  
    private Image image;  
  
    public AnimationExample() {  
        // 加载图片  
        image = ImageIO.read(getClass().getResource("path/to/your/image.jpg"));  
  
        // 设置定时器,每50毫秒刷新一次  
        timer = new Timer(50, this);  
        timer.start();  
  
        setPreferredSize(new Dimension(800, 600));  
    }  
  
    @Override  
    protected void paintComponent(Graphics g) {  
        super.paintComponent(g);  
  
        // 转换Graphics对象为Graphics2D,以便使用更高级的图形功能  
        Graphics2D g2d = (Graphics2D) g;  
  
        // 应用旋转  
        g2d.rotate(Math.toRadians(angle), image.getWidth(null) / 2, image.getHeight(null) / 2);  
  
        // 应用缩放  
        g2d.scale(scale, scale);  
  
        // 应用平移  
        g2d.translate(x, y);  
  
        // 绘制图片  
        g2d.drawImage(image, 0, 0, null);  
  
        // 重置转换(如果需要再次绘制时保持初始状态)  
        g2d.setTransform(new AffineTransform());  
    }  
  
    @Override  
    public void actionPerformed(ActionEvent e) {  
        // 更新角度、缩放和平移  
        angle += 2;  
        scale += 0.01; // 放大  
        x += 1;  
        y += 1;  
  
        // 重绘组件  
        repaint();  
    }  
  
    public static void main(String[] args) {  
        JFrame frame = new JFrame("Animation Example");  
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
        frame.add(new AnimationExample());  
        frame.pack();  
        frame.setLocationRelativeTo(null);  
        frame.setVisible(true);  
    }  
}
  • paintComponent方法中,我使用了Graphics2D的rotatescaletranslate方法来分别应用旋转、缩放和移动效果。
    AffineTransform的setTransform方法用于重置图形上下文的当前转换矩阵,这意呈着如果你在绘制多个对象时想要它们独立地应用不同的转换,你可能需要在每个对象绘制之前调用setTransform。但在本例中,因为我们只对一张图片进行所有操作,并且希望在每次repaint时都从头开始应用这些操作,所以重置转换矩阵不是必须的(尽管我在这里包含了它作为最佳实践)。
    通过调整Timer的延迟时间和actionPerformed方法中的增量值,你可以控制动画的速度和效果。
    博主用心写,读者点关注,互动传真情,知识不迷路。
举报

相关推荐

0 条评论