1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193
| package interpolator;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javafx.animation.FadeTransition;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.animation.Interpolator;
import javafx.animation.ParallelTransition;
import javafx.animation.PauseTransition;
import javafx.animation.RotateTransition;
import javafx.animation.SequentialTransition;
import javafx.animation.Transition;
import javafx.animation.TranslateTransition;
import javafx.application.Platform;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Node;
import javafx.scene.chart.Chart;
import javafx.scene.chart.LineChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.control.Label;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.FlowPane;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
import javafx.util.Duration;
public class Main extends Application {
@Override
public void start(final Stage primaryStage) {
final Interpolator[] interpolators = {Interpolator.LINEAR, Interpolator.EASE_IN, Interpolator.EASE_OUT, Interpolator.EASE_BOTH, Interpolator.DISCRETE};
final int side = 50;
final Duration animationDuration = Duration.seconds(3);
final List<Transition> animationList = new ArrayList<>();
final FlowPane demoFlow1 = new FlowPane();
demoFlow1.getChildren().addAll(Arrays.stream(interpolators).
map(interpolator -> {
final Label label = new Label();
label.setText(interpolator.toString());
final Rectangle rectangle = new Rectangle(side, side);
rectangle.setFill(Color.BLUE);
final VBox rectangleVBox = new VBox();
rectangleVBox.setPadding(new Insets(10));
rectangleVBox.setSpacing(10);
rectangleVBox.setAlignment(Pos.CENTER);
rectangleVBox.getChildren().setAll(label, rectangle);
final RotateTransition rotateTransition = new RotateTransition(animationDuration, rectangle);
rotateTransition.setFromAngle(0);
rotateTransition.setToAngle(240);
rotateTransition.setInterpolator(interpolator);
animationList.add(rotateTransition);
return rectangleVBox;
})
.toArray(Node[]::new));
final FlowPane demoFlow2 = new FlowPane();
demoFlow2.getChildren().addAll(Arrays.stream(interpolators).
map(interpolator -> {
final Label label = new Label();
label.setText(interpolator.toString());
final Circle circle = new Circle(side / 2d);
circle.setFill(Color.RED);
circle.setOpacity(0.5);
final VBox rectangleVBox = new VBox();
rectangleVBox.setPadding(new Insets(10));
rectangleVBox.setSpacing(10);
rectangleVBox.setAlignment(Pos.CENTER);
rectangleVBox.getChildren().setAll(label, circle);
final TranslateTransition translateTransition = new TranslateTransition(animationDuration, circle);
translateTransition.setFromX(0);
translateTransition.setFromY(0);
translateTransition.setToX(100);
translateTransition.setToY(-100);
translateTransition.setInterpolator(interpolator);
animationList.add(translateTransition);
return rectangleVBox;
})
.toArray(Node[]::new));
final FlowPane demoFlow3 = new FlowPane();
demoFlow3.getChildren().addAll(Arrays.stream(interpolators).
map(interpolator -> {
final Label label = new Label();
label.setText(interpolator.toString());
final Image image = new Image("http://www.developpez.net/template/images/logo.png", side * 2, side, true, true);
final ImageView imageView = new ImageView(image);
final VBox rectangleVBox = new VBox();
rectangleVBox.setPadding(new Insets(10));
rectangleVBox.setSpacing(10);
rectangleVBox.setAlignment(Pos.CENTER);
rectangleVBox.getChildren().setAll(label, imageView);
final FadeTransition fadeTransition = new FadeTransition(animationDuration, imageView);
fadeTransition.setFromValue(0);
fadeTransition.setToValue(1);
fadeTransition.setInterpolator(interpolator);
animationList.add(fadeTransition);
return rectangleVBox;
})
.toArray(Node[]::new));
final ParallelTransition allDemoAnimations = new ParallelTransition();
allDemoAnimations.getChildren().setAll(animationList);
final PauseTransition pauseAtEnd = new PauseTransition(Duration.seconds(3));
final SequentialTransition animation = new SequentialTransition(allDemoAnimations, pauseAtEnd);
animation.setCycleCount(Transition.INDEFINITE);
final FlowPane chartFlow = new FlowPane();
chartFlow.getChildren().addAll(Arrays.stream(interpolators).
map(this::createChartForInterpolator)
.toArray(Node[]::new));
final VBox root = new VBox();
root.setFillWidth(true);
root.getChildren().setAll(demoFlow1, demoFlow2, demoFlow3, chartFlow);
final Scene scene = new Scene(root, 1000, 600);
primaryStage.setTitle("Test interpolators");
primaryStage.setScene(scene);
primaryStage.show();
Platform.runLater(animation::playFromStart);
final StackPane root2 = new StackPane();
root2.getChildren().add(createSummaryChartForInterpolators(interpolators));
final Scene scene2 = new Scene(root2);
final Stage dialog = new Stage();
dialog.initStyle(StageStyle.UTILITY);
dialog.initOwner(primaryStage);
dialog.setScene(scene2);
dialog.show();
dialog.setWidth(600);
dialog.setHeight(600);
}
private Chart createChartForInterpolator(final Interpolator interpolator) {
final double minX = 0;
final double maxX = 1;
final LineChart.Series series = new LineChart.Series<>();
series.setName("y = interpolator(x)");
for (double x = minX; x <= maxX + 0.01; x += 0.01) {
final double y = interpolator.interpolate(minX, maxX, x);
final LineChart.Data data = new LineChart.Data<>(x, y);
series.getData().add(data);
}
final NumberAxis xAxis = new NumberAxis(minX, maxX, (maxX - minX) / 10d);
final NumberAxis yAxis = new NumberAxis(minX, maxX + 0.1, (maxX - minX) / 10d);
final LineChart lineChart = new LineChart(xAxis, yAxis);
lineChart.setPrefWidth(200);
lineChart.setPrefHeight(200);
lineChart.setTitle(interpolator.toString());
lineChart.getData().add(series);
series.getData()
.stream()
.forEach(data -> ((LineChart.Data) data).setNode(null));
return lineChart;
}
public static void main(String[] args) {
launch(args);
}
private Chart createSummaryChartForInterpolators(final Interpolator... interpolators) {
final double minX = 0;
final double maxX = 1;
final LineChart.Series[] allSeries = Arrays.stream(interpolators)
.map(interpolator -> {
final LineChart.Series series = new LineChart.Series<>();
series.setName("y = " + interpolator.toString() + "(x)");
for (double x = minX; x <= maxX + 0.01; x += 0.01) {
final double y = interpolator.interpolate(minX, maxX, x);
final LineChart.Data data = new LineChart.Data<>(x, y);
series.getData().add(data);
}
return series;
})
.toArray(LineChart.Series[]::new);
final NumberAxis xAxis = new NumberAxis(minX, maxX, (maxX - minX) / 10d);
final NumberAxis yAxis = new NumberAxis(minX, maxX + 0.1, (maxX - minX) / 10d);
final LineChart lineChart = new LineChart(xAxis, yAxis);
lineChart.setLegendVisible(true);
lineChart.setPrefWidth(200);
lineChart.setPrefHeight(200);
lineChart.setTitle("All Interpolators");
lineChart.getData().setAll(allSeries);
Arrays.stream(allSeries)
.forEach(series -> series.getData()
.stream()
.forEach(data -> ((LineChart.Data) data).setNode(null)));
return lineChart;
}
} |
Partager