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+环境。*
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/23807.html