Не совсем понятно, что из-за того, что ваш текущий код не работает, но я предполагаю следующее:
- Вы хотите, чтобы ваша кнопка появлялась, когда мышь входила и исчезалакогда мышь выходит из режима.
- Функция затухания работает не так, как вам хочется
- Пробуя что-то похожее на ваши настройки, я заметил, что узел не исчезнет, если мышь завершит работу до завершения анимации.
Проблема
При попытке изменить анимацию вы изменяете свойство cycleCount
.Это свойство не влияет на направление воспроизведения, а скорее на то, сколько циклов воспроизводит анимация перед остановкой:
Определяет количество циклов в этой анимации.cycleCount
может быть INDEFINITE
для анимаций, которые повторяются бесконечно, но в противном случае должно быть > 0
.
Невозможно изменить cycleCount
работающего Animation
.Если значение cycleCount
изменяется для работающего Animation
, анимация должна быть остановлена и запущена снова, чтобы подобрать новое значение.
Вы комбинируете настройку cycleCount
с настройкой autoReverse
до true
в надежде на то, что анимация перевернется, когда вы установите cycleCount
в 2
.Свойство autoReverse
:
Определяет, меняет ли это Animation
направление на чередующиеся циклы.Если true
, Animation
будет продолжаться вперед в первом цикле, затем переворачивается во втором цикле и так далее.В противном случае анимация будет повторяться так, что каждый цикл будет продолжаться с самого начала.Невозможно изменить флаг autoReverse
работающего Animation
.Если значение autoReverse
изменяется для работающего Animation
, анимация должна быть остановлена и запущена снова, чтобы подобрать новое значение.
Эта установка может работать несколько, особенно сиспользование playFromStart()
и playFrom(fadeDuration)
, но это неправильный способ сделать то, что вы хотите.
Решение
То, что вы хотите, это изменить rate
свойство в зависимости от того, вошла или нет мышь.Свойство rate
:
Определяет направление / скорость, с которой ожидается воспроизведение Animation
.
Абсолютное значение rate
указывает скорость, с которойAnimation
должен быть воспроизведен, а знак rate
указывает направление.Положительное значение rate
указывает на воспроизведение в прямом направлении, отрицательное значение указывает на воспроизведение в обратном направлении и 0.0
для остановки воспроизведения Animation
.
Rate 1.0
- нормальное воспроизведение, 2.0 is
2 time normal,
-1.0` назад и т. Д.
Обращение rate
бега Animation
заставит Animation
изменить направление на место и воспроизвести часть уже Animation
, которая ужепрошло.
Вот небольшой пример.Он использует Button
вместо JFXButton
, потому что мне не хотелось тянуть зависимость.Кроме того, он использует свойство hover
, но функционально эквивалентен использованию обработчиков, введенных мышью / обработчиком мыши.
import javafx.animation.FadeTransition;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import javafx.util.Duration;
public class Main extends Application {
@Override
public void start(Stage primaryStage) {
Button button = new Button("Click me!");
button.setOnAction(event -> {
event.consume();
System.out.println("Button clicked!");
});
installAnimation(button);
primaryStage.setScene(new Scene(new StackPane(button), 300.0, 150.0));
primaryStage.setTitle("Animation Example");
primaryStage.show();
}
private void installAnimation(Button button) {
FadeTransition transition = new FadeTransition(Duration.millis(250.0), button);
transition.setFromValue(0.2);
transition.setToValue(1.0);
button.hoverProperty().addListener((obs, wasHover, isHover) -> {
transition.setRate(isHover ? 1.0 : -1.0);
transition.play();
});
button.setOpacity(transition.getFromValue());
}
}
Обратите внимание на следующее: