package src.com.fxexperience.javafx.animation; import javafx.animation.Interpolator; import javafx.animation.KeyFrame; import javafx.animation.KeyValue; import javafx.animation.TimelineBuilder; import javafx.scene.Node; import javafx.scene.transform.Rotate; import javafx.util.Duration; /** * Animate a hinge effect on a node * * Port of Hinge from Animate.css http://daneden.me/animate by Dan Eden * * {@literal @}keyframes hinge { 0% { transform: rotate(0); transform-origin: * top left; animation-timing-function: ease-in-out; } 20%, 60% { transform: * rotate(80deg); transform-origin: top left; animation-timing-function: * ease-in-out; } 40% { transform: rotate(60deg); transform-origin: top left; * animation-timing-function: ease-in-out; } 80% { transform: rotate(60deg) * translateY(0); opacity: 1; transform-origin: top left; * animation-timing-function: ease-in-out; } 100% { transform: * translateY(700px); opacity: 0; } } * * @author Jasper Potts */ public class HingeTransition extends CachedTimelineTransition { private Rotate rotate; /** * Create new HingeTransition * * @param node * The node to affect */ public HingeTransition(final Node node) { super(node, null); setCycleDuration(Duration.seconds(2)); setDelay(Duration.seconds(0.2)); } @Override protected void starting() { super.starting(); double endY = node.getScene().getHeight() - node.localToScene(0, 0).getY(); rotate = new Rotate(0, 0, 0); timeline = TimelineBuilder .create() .keyFrames( new KeyFrame(Duration.millis(0), new KeyValue( rotate.angleProperty(), 0, Interpolator.EASE_BOTH)), new KeyFrame(Duration.millis(200), new KeyValue(rotate .angleProperty(), 80, Interpolator.EASE_BOTH)), new KeyFrame(Duration.millis(400), new KeyValue(rotate .angleProperty(), 60, Interpolator.EASE_BOTH)), new KeyFrame(Duration.millis(600), new KeyValue(rotate .angleProperty(), 80, Interpolator.EASE_BOTH)), new KeyFrame(Duration.millis(800), new KeyValue(node .opacityProperty(), 1, Interpolator.EASE_BOTH), new KeyValue(node.translateYProperty(), 0, Interpolator.EASE_BOTH), new KeyValue( rotate.angleProperty(), 60, Interpolator.EASE_BOTH)), new KeyFrame(Duration.millis(1000), new KeyValue(node .opacityProperty(), 0, Interpolator.EASE_BOTH), new KeyValue(node.translateYProperty(), endY, Interpolator.EASE_BOTH), new KeyValue( rotate.angleProperty(), 60, Interpolator.EASE_BOTH))).build(); node.getTransforms().add(rotate); } @Override protected void stopping() { super.stopping(); node.getTransforms().remove(rotate); node.setTranslateY(0); } }