JavaFX: анимация, которая использует PathTransition в качестве пера для рисования
Пример кода
//node
Rectangle rect = new Rectangle (0, 0, 20, 20);
//path
Text text = TextBuilder.create()
.text("J a v a F X R o c k s")
.font(new Font(50))
.x(65)
.y(100)
.build();
// path transition
pathTransition = PathTransitionBuilder.create()
.duration(Duration.seconds(15))
.path(text)
.node(rect)
.orientation(OrientationType.ORTHOGONAL_TO_TANGENT)
.cycleCount(Timeline.INDEFINITE)
.autoReverse(true)
.build();
Я хочу отобразить часть текста (путь), который путешествовал по узлу rect. Имея в виду на приведенном выше рисунке, как rect узел путешествовал до java, я хочу, чтобы отобразить эту часть только в этот момент времени ..
1 ответ:
Можно попробовать назначить тексту область отсечения и обновить ее во время анимации:
public void start(Stage primaryStage) { final Rectangle pen = new Rectangle(0, 0, 20, 20); // this pane this contain clipping final Pane clip = new Pane(); // listener to update clipping area ChangeListener changeListener = new ChangeListener() { @Override public void changed(ObservableValue ov, Object t, Object t1) { Rectangle newrect = new Rectangle(pen.getTranslateX(), pen.getTranslateY(), pen.getWidth(), pen.getHeight()); newrect.setRotate(pen.getRotate()); clip.getChildren().add(newrect); } }; // rect coordinates will be changed during animation, so we will listen to them pen.translateXProperty().addListener(changeListener); pen.translateYProperty().addListener(changeListener); pen.rotateProperty().addListener(changeListener); final Text text = TextBuilder.create() .text("J a v a F X R o c k s") .font(new Font(50)) .clip(clip) .x(65) .y(100) .build(); PathTransition pathTransition = PathTransitionBuilder.create() .duration(Duration.seconds(15)) .path(text) .node(pen) .orientation(OrientationType.ORTHOGONAL_TO_TANGENT) .build(); // once we done we don't want to store thousands of rectangles used to clip pathTransition.setOnFinished(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent t) { text.setClip(null); clip.getChildren().clear(); } }); Pane root = new Pane(); root.getChildren().addAll(text, pen); primaryStage.setScene(new Scene(root, 600, 200)); primaryStage.show(); pathTransition.play(); }
Немного более эффективным способом хранения области отсечения может быть
Canvas
объект, но это потребует немного математики, чтобы нарисовать прямоугольники с поворотом на холсте, так что это ваш вызов.