🌿🌿🌿跟随博主脚步,从这里开始→博主主页🌿🌿🌿
- 欢迎大家:这里是我的学习笔记、总结知识的地方,喜欢的话请三连,有问题可以私信🌳🌳🌳
您的点赞👍、关注➕、收藏⭐️、评论📝、私信📧是我最大的支持与鼓舞!!!🌻🌻🌻
动画
- 动画
- 过渡动画
- 淡出效果
- 实战演练
- 移动效果
- 实战演练
- 缩放效果
- 实战演练
- 旋转效果
- 实战演练
- 综合实例
动画
- 在JavaFX中使用javafx.animation包中的API可实现动画。
- JavaFX支持两种不同的方法来创建动画。
① 过渡动画
② 时间轴动画
过渡动画
- 最简单的动画可以通过过渡效果实现,使用特定的过渡类,定义有关属性值,然后把它应用到某种节点,最后播放动画(调用过渡对象的play()方法)即可。
- JavaFX提供了一些类方便地实现常见的动画效果。
- 常用的过渡效果类:
javafx.animation.FadeTransition(淡出效果)
javafx.animation.PathTransition (路径变换效果)
javafx.animation.ScaleTransition(缩放效果)
javafx.animation.TranslateTransition(移动效果)
javafx.animation.RotateTransition(旋转效果)
- 它们是
javafx.animation.Animation
的子类,该类中定义了动画的基本操作。
void play()
void playFromStart()
void pause()
void stop()
- 该类中定义了一些属性:
autoReverse
rate
cycleCount(Timeline. INDEFINITE)
status
淡出效果
- 使用FadeTransition类通过改变节点的透明度实现目标节点的逐渐消失效果,再通过setAutoReverse()方法实现节点的或隐或现效果。
- 构造方法:
FadeTransition(Duration duration)指定一次转换持续的时间。可以使用new Duration(double millis)创建Duration实例。
常量INDEFINITE、ONE、UNKNOWN和ZERO来代表一个无限循环、1毫秒、未知以及0的持续时间。
FadeTransition(Duration duration, Node node)
实战演练
示例:使用文本实现淡入淡出。
- 核心代码:
移动效果
- 使用PathTransition类可制作一个在给定时间内,节点沿着一条路径从一个端点到另外一个端点的移动动画。路径通过形状(Shape)对象指定。
- PathTransition类的常用构造方法如下:
PathTransition(Duration duration, Shape shape)
PathTransition(Duration duration, Shape shape, Node node)
- 属性:
duration
shape
node
orientation
实战演练
问题描述: 使用一个图片实现按路径移动同时播放音乐的效果。
核心代码:
缩放效果
- 使用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的rotate
、scale
和translate
方法来分别应用旋转、缩放和移动效果。
AffineTransform的setTransform
方法用于重置图形上下文的当前转换矩阵,这意呈着如果你在绘制多个对象时想要它们独立地应用不同的转换,你可能需要在每个对象绘制之前调用setTransform。
但在本例中,因为我们只对一张图片进行所有操作,并且希望在每次repaint时都从头开始应用这些操作,所以重置转换矩阵不是必须的(尽管我在这里包含了它作为最佳实践)。
通过调整Timer
的延迟时间和actionPerformed
方法中的增量值,你可以控制动画的速度和效果。
博主用心写,读者点关注,互动传真情,知识不迷路。