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);
}
}