Статьи

PathTransitions на основе выражений в JavaFX

В JavaFX вы можете анимировать узлы вдоль пути, используя объекты PathTransition . PathTransitions используют объекты Shape для описания пути, по которому они должны анимироваться. JavaFX предоставляет различные типы фигур (например, Polygon, Circle, PolyLine, Path). Форма Path интересна тем, что позволяет создавать сложные формы, используя различные движения, называемые PathElement . Некоторыми PathElements являются ArcTo, CubicCurveTo, HLineTo, LineTo, MoveTo, QuadCurveTo, VLineTo. Их имена подразумевают то, что они делают.

Хотя PathElemetns отлично подходят для описания сложных путей, я обнаружил, что лучше описывать свои пути с помощью математических выражений. Все годы работы с графиками на уроках математики повлияли на то, как мыслит мой разум. Квадратичные и тригонометрические выражения создают ощущение тепла и уюта. Поэтому я пытался создать PathTransitions, которые описываются с использованием математических выражений. Я опишу свое решение в этом посте на случай, если кто-то захочет сделать то же самое.

Для этого в первую очередь нужен способ решения математических выражений, таких как x * sin (x), или x ^ 2/45, или (x ^ 2) / sin (x-2), или что-либо еще, что вы можете себе представить. Для этого мне посчастливилось наткнуться на веб-сайт Software Monkey Лоуренса Дола. Лоуренс создал супер легкий Java-класс с именем MathEval, который оценивает математические выражения. Класс только 31 КБ и очень прост в использовании. Я использовал MathEval для построения точек данного выражения.

JavaFx класс Polyline используется для хранения нанесенных точек, для которых MathEval решил, и преобразования их в объект Shape, который PathTransition может принимать в качестве входных данных.

Класс, который я в итоге создал, называется ExpressionTransitionMaker — извините, нет Javadoc, но вы можете найти исходный код здесь . Этот класс должен быть очень простым в использовании. У него есть два основных метода, которые стоит упомянуть. Первый:

1
public void addExpressionEntry(double start, double end, double poll, GraphType type, String expression) throws IllegalArgumentException;

Этот метод используется для добавления записей выражения, которые состоят из выражения со вспомогательной информацией, такой как начальная и конечная позиции на графике, интервал опроса и GraphType. ExpressionTransitionMaker может создавать три различных типа графиков, описанных этим перечислением GraphType:

01
02
03
04
05
06
07
08
09
10
11
12
13
public enum GraphType {
 
        vertical("y"), horizontal("x"), polar("a");
        private String var;
 
        GraphType(String var) {
            this.var = var;
        }
 
        public String getVar() {
            return var;
        }
    }

Каждая запись выражения требует одного выражения. Для горизонтальных графиков выражение должно быть в форме f (x); g (y) для вертикали; и r (a) для полярности. То есть горизонтальному графику нужны выражения, в которых единственной переменной является буква «x», а вертикальному графику необходимо выражение, в котором единственной переменной является буква «y», а полярному графику нужно выражение, в котором только переменная — это буква «а», где «а» обозначает угол в радианах. Можно добавить несколько выражений.

Как следует из названия, горизонтальные и вертикальные графики предназначены для графиков, которые идут влево-вправо и вверх-вниз соответственно. Полярные графики предназначены для графиков, которые движутся по круговой или спиральной траектории. Все три могут идти в противоположном направлении, если дано отрицательное значение опроса и соответствующие начальные и конечные точки.

Второй метод, который стоит упомянуть:

1
public SequentialTransition getSequentialTransition();

Поскольку в ExpressionTransitionMaker можно добавить несколько выражений, объект SequentialTransition используется для воспроизведения всех PathTransitions, которые может создать ExpressionTransitionMaker. Возвращенный SequentialTransition заполняется несколькими PathTransitions, по одному для каждого добавленного выражения. SequentialTransition будет воспроизводить все свои переходы в последовательном порядке.

Ну вот и все. В ExpressionTransitionMaker есть еще один или два открытых метода, которые пользователь мог бы найти удобными, но для краткости был опущен. Я создал простое небольшое приложение, которое тестирует ExpressionTransitionMaker и может быть найдено здесь . Приложение можно воспроизводить через браузер, и оно позволяет вводить несколько выражений, которые используются для анимации изображения на экране.

Если у вас есть какие-либо отзывы, я хотел бы прочитать их.

Ссылка: PathTransitions на основе выражений в JavaFX от нашего партнера по W4G