как Выполнить последовательно

219
21 апреля 2018, 20:07

Как выполнить последовательно эти два метода? получается что они выполняются одновременно, а нужно чтобы сначала прямоугольник перемещался по оси У а потом по Х

public void onClick() throws InterruptedException {
    takeFrom();
    otvodRoll();
}
/**
 * Едем по отводящему рольгангу: шаг 2
 */
public void otvodRoll(){
    // Конечная позиция:
    double stopPositionX = 24;
    KeyFrame keyFrame = new KeyFrame(
            // Считаем, сколько времени будет длиться анимация:
            Duration.millis((tube.getLayoutX() - stopPositionX) / 2 * 50),
            event -> {
                logArea.setText(logArea.getText() + "\nПеремещение трубы по отводящему рольгангу окончено");
            },
            // Указываем, какое свойство анимировать, его конечное значение и алгоритм:
            new KeyValue(tube.layoutXProperty(), stopPositionX, Interpolator.LINEAR)
    );
    // Создаем и запускаем одноразовый таймер для анимации по ключевому кадру:
    Timeline timeline = new Timeline();
    timeline.getKeyFrames().add(keyFrame);
    timeline.setCycleCount(1);
    timeline.delayProperty();
    timeline.play();

}
/**
 * С поперечного транспортера получаем трубу: шаг 1
 * @throws InterruptedException
 */
public void takeFrom() throws InterruptedException {
    // Конечная позиция:
    double stopPositionY = 78;
    KeyFrame keyFrame = new KeyFrame(
            // Считаем, сколько времени будет длиться анимация:
            Duration.seconds((Math.abs(tube.getLayoutY() - stopPositionY) ) / 13.3),
            event -> {
                logArea.setText("Положили трубу с поперечного транспортера");
            },
            // Указываем, какое свойство анимировать, его конечное значение и алгоритм:
            new KeyValue(tube.layoutYProperty(), stopPositionY, Interpolator.LINEAR)
    );
    // Создаем и запускаем одноразовый таймер для анимации по ключевому кадру:
    Timeline timeline = new Timeline();
    timeline.getKeyFrames().add(keyFrame);
    timeline.setCycleCount(1);
    timeline.play();
}

UPD1

Answer 1

На завершение анимации можно установить обработчик. Поэтому достаточно из метода возвращать Timeline и устанавливать этот обработчик в вызывающем методе

public Timeline takeFrom() throws InterruptedException {
    ...
    return timeline;
}
public void onClick() throws InterruptedException {
    takeFrom().setOnFinished(event -> otvodRoll());
}

или принимать обработчик в качестве аргумента и передавать его из вызывающего метода

public void takeFrom(EventHandler<ActionEvent> handler) throws InterruptedException {
    ...
    timeline.setOnFinished(handler);
    timeline.play();
}
public void onClick() throws InterruptedException {
    takeFrom(event -> otvodRoll());
}

Лучше даже сделать так, чтобы оба метода могли возвращать Animation и реализовывали сигнатуру EventHandler.handle(), чтобы их можно было объединять в произвольные цепочки.

Answer 2

Если сделать так, чтобы методы возвращали Timeline:

public Timeline takeFrom() {
    KeyFrame keyFrame = new KeyFrame(...);
    return new Timeline(keyFrame);
}
public Timeline otvodRoll() {
    KeyFrame keyFrame = new KeyFrame(...);
    return new Timeline(keyFrame);
}

Тогда можно использовать SequentialTransition:

SequentialTransition sequence = new SequentialTransition(
    takeFrom(),
    otvodRoll()
);
sequence.play();

Еще для такого случая, когда нужны только простые передвижения, можно воспользоваться PathTransition. Для этого нужно создать путь Path от центра прямоугольника до нужных точек и указать этот путь и узел (прямоугольник) в параметрах PathTransition. При этом время можно не высчитывать, а задать скорость через метод setRate(). Единственное замечание — нужно понимать, что если в исходных примерах анимировалась позиция прямоугольника на панели (layoutXProperty и layoutYProperty), то PathTransition анимирует X и Y в матрице преобразования координат (translateXProperty и translateYProperty):

public void pathAnimation(ActionEvent event) {
    double stopPositionX = 100;
    double stopPositionY = 216;
    double xOffset = tube.getWidth() / 2;
    double yOffset = tube.getHeight() / 2;
    Path path = new Path();
    path.getElements().addAll(
            new MoveTo(xOffset, yOffset),
            new VLineTo(stopPositionY - tube.getLayoutY()),
            new HLineTo(stopPositionX - tube.getLayoutX()));
    PathTransition pathTransition = new PathTransition();
    pathTransition.setNode(tube);
    pathTransition.setPath(path);
    // pathTransition.setDuration(Duration.millis(2000));
    pathTransition.setRate(0.17);
    pathTransition.setOnFinished(event1 -> {
        System.out.println("Движение закончено");
    });
    pathTransition.play();
}
READ ALSO
SecurityException: Invalid certificates

SecurityException: Invalid certificates

Взял лаунчер из этого репозитория: Launcher Minecraft

233
Проблема при работе с Java кодом

Проблема при работе с Java кодом

Мне надо написать плагин для Cordova для работы по BluetoothНашел работающий код на Java и теперь мне надо интегрировать его в свой плагин

222
Загрузка и проигрывание аудио Android 4+

Загрузка и проигрывание аудио Android 4+

Каким способом можно реализовать одновременное проигрывание аудио из интернета и его загрузку на устройство в Android 4+? Подходит ли для этого...

160
необходимо создать сервер java

необходимо создать сервер java

Необходимо создать сервер java который каждые 20 мс отсылает пакеты, а клиент каждые 20мс принимаетТакже посоветуйте как эти данные сохранять...

144