上一篇
在JavaFX中,Transition类用于创建属性变化的动画效果,通过定义起始值、结束值和持续时间,结合Interpolator实现平滑过渡,可应用于节点位移、缩放、旋转或透明度变化等场景,例如FadeTransition可实现淡入淡出效果。
Java中的Transition通常指状态转换,尤其在状态机(如Spring State Machine)或动画(如JavaFX)中应用广泛,以下从状态机转换和动画过渡两大场景详细说明用法:
状态机中的状态转换(以Spring State Machine为例)
状态机通过Transition实现状态间的流转,需定义触发条件、动作和状态变化。
核心步骤
① 定义状态和事件

public enum States {
STATE_A, STATE_B, STATE_C
}
public enum Events {
EVENT_1, EVENT_2
}
② 配置状态转换规则
@Configuration
@EnableStateMachine
public class StateMachineConfig extends EnumStateMachineConfigurerAdapter<States, Events> {
@Override
public void configure(StateMachineStateConfigurer<States, Events> states) throws Exception {
states.withStates()
.initial(States.STATE_A)
.states(EnumSet.allOf(States.class));
}
@Override
public void configure(StateMachineTransitionConfigurer<States, Events> transitions) throws Exception {
transitions
// 当EVENT_1发生时,从STATE_A转换到STATE_B
.withExternal()
.source(States.STATE_A)
.target(States.STATE_B)
.event(Events.EVENT_1)
.and()
// 当EVENT_2发生时,从STATE_B转换到STATE_C
.withExternal()
.source(States.STATE_B)
.target(States.STATE_C)
.event(Events.EVENT_2);
}
}
③ 触发转换并监听状态变化
@Service
public class StateService {
@Autowired
private StateMachine<States, Events> stateMachine;
public void changeState(Events event) {
// 发送事件触发转换
stateMachine.sendEvent(event);
}
// 监听状态变更
@OnTransition(source = "STATE_A", target = "STATE_B")
public void onTransition() {
System.out.println("状态从A切换到B!");
}
}
高级用法
- 条件转换:添加条件判断
.withExternal() .source(States.STATE_A) .target(States.STATE_B) .event(Events.EVENT_1) .guard(context -> /* 返回boolean的条件 */) // 仅当条件满足时转换 - 动作执行:转换时执行操作
.action(context -> { System.out.println("转换中执行自定义逻辑"); })
JavaFX中的动画过渡(Transition类)
用于创建平滑动画效果,如移动、渐变等。

基础动画实现
示例:水平移动一个矩形
import javafx.animation.Transition;
import javafx.util.Duration;
import javafx.scene.shape.Rectangle;
public class MoveTransition extends Transition {
private final Rectangle rect;
private final double startX;
private final double endX;
public MoveTransition(Rectangle rect, double endX, Duration duration) {
this.rect = rect;
this.startX = rect.getX();
this.endX = endX;
setCycleDuration(duration); // 设置动画持续时间
}
@Override
protected void interpolate(double frac) {
// frac是0.0到1.0的插值进度
double newX = startX + (endX - startX) * frac;
rect.setX(newX);
}
}
// 使用动画
Rectangle rect = new Rectangle(50, 50, 100, 100);
MoveTransition move = new MoveTransition(rect, 300, Duration.seconds(2));
move.play(); // 启动动画
内置过渡动画
JavaFX提供预置类简化开发:
// 平移动画 TranslateTransition translate = new TranslateTransition(); translate.setNode(rect); // 作用对象 translate.setDuration(Duration.seconds(1)); translate.setByX(200); // X轴移动200px translate.play(); // 渐变动画 FadeTransition fade = new FadeTransition(); fade.setNode(rect); fade.setDuration(Duration.seconds(3)); fade.setFromValue(1.0); // 起始透明度 fade.setToValue(0.0); // 结束透明度 fade.play();
复合动画
组合多个动画效果:

ParallelTransition parallel = new ParallelTransition(
new FadeTransition(rect, Duration.seconds(2), 1.0, 0.5),
new RotateTransition(rect, Duration.seconds(2), 360)
);
parallel.play(); // 同时执行
使用注意事项
- 状态机:
- 确保状态转换的幂等性(多次触发同一事件结果一致)。
- 复杂逻辑建议使用
@WithStateMachine注解拆分监听器。
- 动画:
- 避免频繁创建
Transition对象,复用实例提升性能。 - 使用
Interpolator(如EASE_IN)定制速度曲线。
- 避免频繁创建
- 通用原则:
- 资源释放:动画结束调用
transition.stop()释放资源。 - 线程安全:JavaFX动画需在JavaFX应用线程操作。
- 资源释放:动画结束调用
典型应用场景
| 场景 | 技术方案 | 案例 |
|---|---|---|
| 订单状态流转 | Spring State Machine | 电商订单(待付款→已发货) |
| UI元素交互反馈 | JavaFX TranslateTransition | 按钮悬停滑动效果 |
| 游戏角色状态切换 | 自定义状态机 | 玩家(行走→攻击→死亡) |
| 数据加载动画 | JavaFX FadeTransition | 进度条淡入淡出 |
引用说明:
- Spring State Machine官方文档:https://spring.io/projects/spring-statemachine
- JavaFX Transition API文档:https://openjfx.io/javadoc/17/javafx.graphics/javafx/animation/Transition.html
- Oracle JavaFX教程:https://docs.oracle.com/javase/8/javafx/api/javafx/animation/Animation.html 遵循Java官方规范及Spring最佳实践,适用于JDK 8+和Spring Boot 2.x+环境。*
